Load libraries

library(here)
here() starts at C:/Users/User/OneDrive - Universidad de Oviedo/IMIB/Analyses/MOTIVATE/DB_first_check
library(readr)
library(tidyr)
library(dplyr)

Adjuntando el paquete: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(lubridate)

Adjuntando el paquete: ‘lubridate’

The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union
library(ggplot2)
library(stringr)
library(purrr)
library(readxl)

Read the data

db<-read_tsv(here("data", "raw",
                  "200_MOTIVATE20240412_header_notJUICE_with_precise_coordinates.csv"))
Aviso: One or more parsing issues, call `problems()` on your data frame for
details, e.g.:
  dat <- vroom(...)
  problems(dat)
Quitting from lines 25-27 [unnamed-chunk-2] (db_first_check.Rmd)
Rows: 2387117 Columns: 69── Column specification ────────────────────────────────────────────────────
Delimiter: "\t"
chr (33): Country, Biblioreference, Nr. table in publ., Nr. relevé in ta...
dbl (20): PlotObservationID, PlotID, TV2 relevé number, Relevé area (m²)...
lgl (16): Lon1, Lon2, Lon3, Lon4, Lat1, Lat2, Lat3, Lat4, X1, X2, X3, X4...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Problems (do not affect us)

problems<-problems(db)
sort(unique(problems$col))
 [1] 52 53 54 55 56 57 58 59 62 63 64 65 66 67 68 69
names(db[52:69])
 [1] "Lon1" "Lon2" "Lon3" "Lon4" "Lat1" "Lat2" "Lat3" "Lat4" "X"    "Y"   
[11] "X1"   "X2"   "X3"   "X4"   "Y1"   "Y2"   "Y3"   "Y4"  

We will not use these columns, so no problem!

Filter to get only resurveys

db_resurv <- db %>% filter(`ReSurvey plot (Y/N)` == "Y")

Update coordinates

Create new column with old coordinates if new not available, and with new if available.

db_resurv <- db_resurv %>%
  mutate(Lon_updated = ifelse(is.na(Lon_prec),Longitude,Lon_prec),
         Lat_updated = ifelse(is.na(Lat_prec),Latitude,Lat_prec))
print(db_resurv, width = Inf)

Save to csv:

write_csv(db_resurv,here("data", "clean","db_resurv.csv"))

ISSUE 1: ReSurvey plot is NA

Careful! Sometimes ReSurvey plot is NA.

nrow(db_resurv%>%filter(is.na(RS_CODE)))
[1] 0
nrow(db_resurv%>%filter(is.na(`ReSurvey site`)))
[1] 0
nrow(db_resurv%>%filter(is.na(`ReSurvey plot`)))
[1] 111
write_csv(db_resurv %>% filter(is.na(`ReSurvey plot`)),
          here("output", "csv","issue1.csv"))

ISSUE 2: Coordinates are NA

Coordinates are also NA in some cases.

nrow(db_resurv%>%filter(is.na(Lon_updated) & is.na(Lat_updated )))
[1] 949
write_csv(db_resurv %>% filter(is.na(Lon_updated) & is.na(Lat_updated)),
          here("output", "csv","issue2.csv"))

But Resurvey plot and coordinates are never missing at the same time.

nrow(db_resurv%>%
       filter(is.na(`ReSurvey plot`) & is.na(Lon_updated) & is.na(Lat_updated)))
[1] 0

ISSUE 3: Different ReSurvey observations within the same plot have different coordinates

Careful! In some cases different ReSurvey observations within the same plot have different coordinates.

Create two new columns in db_resurv: coordinates_equal indicating if coordinates are exactly equal between ReSurvey observations, and coordinates_consistent, indicating if coordinates are consistent between ReSurvey observations (consistent meaning that difference < 0.001 degrees).

# Define a threshold (e.g., 0.001 degrees for longitude/latitude differences)
threshold <- 0.001

db_resurv <- db_resurv %>%
  group_by(RS_CODE, `ReSurvey site`, `ReSurvey plot`) %>%
  mutate(
    lon_range = ifelse(all(is.na(Lon_updated)), NA,
                        max(Lon_updated, na.rm = T) - 
                         min(Lon_updated, na.rm = T)),
    lat_range = ifelse(all(is.na(Lat_updated)), NA,
                        max(Lat_updated, na.rm = T) - 
                         min(Lat_updated, na.rm = T)),
    coordinates_equal = ifelse(is.na(Lon_updated) & is.na(Lat_updated), NA,
                               lon_range == 0 & lat_range == 0),
    coordinates_consistent = ifelse(is.na(Lon_updated) & is.na(Lat_updated), NA,
                                    lon_range < threshold & 
                                      lat_range < threshold)
  ) %>%
  ungroup() %>%
  select(-lon_range, -lat_range)
write_csv(db_resurv %>% filter(coordinates_equal==FALSE),
          here("output", "csv","issue3.csv"))
db_resurv %>% 
  group_by(RS_CODE,`ReSurvey site`, `ReSurvey plot`) %>%
  summarize(is_equal = all(coordinates_equal),
            is_consistent = all(coordinates_consistent),
            .groups = "drop") %>%
  mutate(coordinate_status = case_when(
    is_equal ~ "Equal",
    !is_equal & is_consistent ~ "Consistent (< 0.001º)",
    !is_equal & !is_consistent ~ "Inconsistent (> 0.001º)")) %>%
  count(coordinate_status)%>%
  mutate(percentage = n / sum(n) * 100) %>%
  ggplot(aes(x = percentage, y = coordinate_status, fill = coordinate_status)) +
  geom_bar(stat = "identity") + 
  geom_text(aes(label = paste0(round(percentage, 1), "%")),
            position = position_stack(vjust = 0.5), size = 3) + 
  labs(x = "Percentage of Plots", y = NULL) +
  theme(axis.text.y = element_text(size = 12)) +
  coord_flip() + theme(legend.position = "none")
ggsave(filename=here("output", "figures","issue3.tiff"),
       width=10,height=7,units="cm",dpi=300)

ISSUE 4: Some plots have only one resurvey

When ReSurvey plot is not NA, use the unique combination of RS_CODE, ReSurvey site and ReSurvey plot to uniquely define each ReSurvey plot (as defined in metadata). When ReSurvey plot is NA (111 rows), use the unique combination of RS_CODE, ReSurvey site and updated coordinates to uniquely define each ReSurvey plot. Check how many resurveys (i.e. different years are there for each unique combination).

count_resurveys <- db_resurv %>%
  # Convert dates to date format and get the year
  mutate(date = dmy(`Date of recording`), year = year(date)) %>%
  group_by(RS_CODE, `ReSurvey site`,
           # If ReSurvey plot is not NA, 
           # group by RS_CODE, `ReSurvey site`, `ReSurvey plot`
           `ReSurvey plot` = ifelse(is.na(`ReSurvey plot`), 
                                    NA_character_, `ReSurvey plot`),
           # If ReSurvey plot is NA, group by coordinates
           Lon_updated = ifelse(is.na(`ReSurvey plot`), Lon_updated, NA_real_),
           Lat_updated = ifelse(is.na(`ReSurvey plot`) , Lat_updated, NA_real_)
  ) %>%
  summarise(
    # Get how many different years for each unique group
    distinct_years=n_distinct(year), 
    # Get how many different dates for each unique group
    distinct_dates=n_distinct(date), .groups = "drop")

Summary stats:

summary(count_resurveys$distinct_years)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   2.000   3.449   4.000  55.000 
sd(count_resurveys$distinct_years)
[1] 2.677649

Histograms:

# For all data
ggplot(count_resurveys, aes(x = distinct_years)) + 
  geom_histogram(fill = "white", color = "black", bins = 55)+
  xlab("Number of ReSurvey observations (different years)") +
  ylab("Number of plots")
ggsave(filename=here("output", "figures","issue4.tiff"),
       width=11,height=7,units="cm",dpi=300)

Number and proportion of plots with only 1 resurvey (should not be so!)

nrow(count_resurveys%>%filter(distinct_years==1))
[1] 1158
nrow(count_resurveys%>%filter(distinct_years==1))/nrow(count_resurveys)
[1] 0.009573571
write_csv(count_resurveys%>%filter(distinct_years==1),
          here("output", "csv","issue4.csv"))

ISSUE 5: Datasets with only presence/absence

db_resurv %>%
  filter(`Cover abundance scale`=="Presence/Absence") %>%
  distinct(Dataset)
ggplot(db_resurv %>% 
         mutate(pres_or_ab =ifelse(`Cover abundance scale`=="Presence/Absence",
                                   "Presence/Absence", "Abundance"),
                DK_Naturdata_Res = ifelse(Dataset == "DK_Naturdata_Res",
                                          "Y", "N")),
                aes(pres_or_ab, fill = DK_Naturdata_Res)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage", x = NULL)
ggsave(filename=here("output", "figures","issue5.tiff"),
       width=12,height=7,units="cm",dpi=300)

For DK_Naturdata_Res - info about habitat from Jerker’s file (see below).

ISSUE 6: Observations with wrong country (GIS)

Read text file wrong_countries obtained in ArcGIS:

wrong_countries <- read_delim(here("data", "clean","wrong_countries.txt"),
                              delim = ";")
Rows: 1850 Columns: 19── Column specification ────────────────────────────────────────────────────
Delimiter: ";"
chr (12): Country, RS_CODE, ReSurvey_s, ReSurvey_p, Lon_update, Lat_upda...
dbl  (7): FID, Join_Count, TARGET_FID, plot_uniqu, year, obs_unique, Plo...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxud3JvbmdfY291bnRyaWVzIDwtIHJlYWRfZGVsaW0oaGVyZShcImRhdGFcIiwgXCJjbGVhblwiLFwid3JvbmdfY291bnRyaWVzLnR4dFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltID0gXCI7XCIpXG5gYGAifQ== -->

```r
wrong_countries <- read_delim(here(\data\, \clean\,\wrong_countries.txt\),
                              delim = \;\)
```

<!-- rnb-source-end -->
```r
wrong_countries <- read_delim(here(\data\, \clean\,\wrong_countries.txt\),
                              delim = \;\)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiUm93czogMTg1MCBDb2x1bW5zOiAxOeKUgOKUgCBDb2x1bW4gc3BlY2lmaWNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbkRlbGltaXRlcjogXFw7XFxcbmNociAoMTIpOiBDb3VudHJ5LCBSU19DT0RFLCBSZVN1cnZleV9zLCBSZVN1cnZleV9wLCBMb25fdXBkYXRlLCBMYXRfdXBkYXRlLCBFLi4uXG5kYmwgICg3KTogRklELCBKb2luX0NvdW50LCBUQVJHRVRfRklELCBwbG90X3VuaXF1LCB5ZWFyLCBvYnNfdW5pcXVlLCBQbG90T2JzSURcbuKEuSBVc2UgYHNwZWMoKWAgdG8gcmV0cmlldmUgdGhlIGZ1bGwgY29sdW1uIHNwZWNpZmljYXRpb24gZm9yIHRoaXMgZGF0YS5cbuKEuSBTcGVjaWZ5IHRoZSBjb2x1bW4gdHlwZXMgb3Igc2V0IGBzaG93X2NvbF90eXBlcyA9IEZBTFNFYCB0byBxdWlldCB0aGlzIG1lc3NhZ2UuXG4ifQ== -->

Rows: 1850 Columns: 19── Column specification ───────────────────────────────────────────────────────── Delimiter: ;
chr (12): Country, RS_CODE, ReSurvey_s, ReSurvey_p, Lon_update, Lat_update, E… dbl (7): FID, Join_Count, TARGET_FID, plot_uniqu, year, obs_unique, PlotObsID ℹ Use spec() to retrieve the full column specification for this data. ℹ Specify the column types or set show_col_types = FALSE to quiet this message.




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


# ISSUE 7: Different cover abundance scales


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMmR3Ykc5MEtHUmlYM0psYzNWeWRpd2dZV1Z6S0dCRGIzWmxjaUJoWW5WdVpHRnVZMlVnYzJOaGJHVmdLU2tnSzF4dUlDQWdJQ0FnSUNBZ1oyVnZiVjlpWVhJb1lXVnpLSGtnUFNBb0xpNWpiM1Z1ZEM0dUtTQXZJSE4xYlNndUxtTnZkVzUwTGk0cElDb2dNVEF3S1NrZ0sxeHVJQ0JzWVdKektIa2dQU0JjSWxCbGNtTmxiblJoWjJVZ2IyWWdVbVZUZFhKMlpYa2diMkp6WlhKMllYUnBiMjV6WENJc0lIZ2dQU0JjSWtOdmRtVnlJR0ZpZFc1a1lXNWpaU0J6WTJGc1pWd2lLU0FyWEc0Z0lHTnZiM0prWDJac2FYQW9LVnh1WjJkellYWmxLR1pwYkdWdVlXMWxQV2hsY21Vb1hDSnZkWFJ3ZFhSY0lpd2dYQ0ptYVdkMWNtVnpYQ0lzWENKcGMzTjFaVGN1ZEdsbVpsd2lLU3hjYmlBZ0lDQWdJQ0IzYVdSMGFEMHhPQ3hvWldsbmFIUTlNVEFzZFc1cGRITTlYQ0pqYlZ3aUxHUndhVDB6TURBcFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBDb3ZlciBhYnVuZGFuY2Ugc2NhbGVgKSkgK1xuICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgK1xuICBsYWJzKHkgPSBcIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zXCIsIHggPSBcIkNvdmVyIGFidW5kYW5jZSBzY2FsZVwiKSArXG4gIGNvb3JkX2ZsaXAoKVxuZ2dzYXZlKGZpbGVuYW1lPWhlcmUoXCJvdXRwdXRcIiwgXCJmaWd1cmVzXCIsXCJpc3N1ZTcudGlmZlwiKSxcbiAgICAgICB3aWR0aD0xOCxoZWlnaHQ9MTAsdW5pdHM9XCJjbVwiLGRwaT0zMDApXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBDb3ZlciBhYnVuZGFuY2Ugc2NhbGVgKSkgK1xuICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgK1xuICBsYWJzKHkgPSBcIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zXCIsIHggPSBcIkNvdmVyIGFidW5kYW5jZSBzY2FsZVwiKSArXG4gIGNvb3JkX2ZsaXAoKVxuZ2dzYXZlKGZpbGVuYW1lPWhlcmUoXCJvdXRwdXRcIiwgXCJmaWd1cmVzXCIsXCJpc3N1ZTcudGlmZlwiKSxcbiAgICAgICB3aWR0aD0xOCxoZWlnaHQ9MTAsdW5pdHM9XCJjbVwiLGRwaT0zMDApXG5gYGAifQ== -->

```r
ggplot(db_resurv, aes(`Cover abundance scale`)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations", x = "Cover abundance scale") +
  coord_flip()
ggsave(filename=here("output", "figures","issue7.tiff"),
       width=18,height=10,units="cm",dpi=300)

ISSUE 8: Wrong EUNIS codes

Used this info in metadata file:

Expert system classification to EUNIS habitats (https://zenodo.org/records/4812736 ; https://floraveg.eu/habitat/). I am sending you legend for EUNIS classification version 2022-10-16 with all codes and meanings, directly prepared from expert system file (second sheet) - it is slightly different from published version in ZENODO (https://zenodo.org/records/4812736 , little bit old dated now) and from https://floraveg.eu/habitat/ (little bit newer than in current EVA version).

Qa = mires and Qb = wetlands P units – in floraveg.eu there is slightly different classification (https://floraveg.eu/habitat/overview/P), but in EVA is still this classification of P:

P Surface waters Pa Base-poor spring and spring brook Pb Calcareous spring and spring brook Pc Brackish-water vegetation Pd Fresh-water small pleustophyte vegetation Pe Fresh-water large pleustophyte vegetation Pf Fresh-water submerged vegetation Pg Fresh-water nymphaeid vegetation Ph Oligotrophic-water vegetation Pi Dystrophic-water vegetation Pj Stonewort vegetation

Presence of “!” simply means that for one unit there are two or more different formulas, e.g. R11 and R11!. So it is only technical stuff.

Multiple assignment of relevé – no priority, alphabetical order, e.g. N16!,S66,S81 means that relevé can be assigned to all 3 units: N16 Mediterranean and Macaronesian coastal dune grassland (grey dune), S66 Mediterranean halo-nitrophilous scrub and S81 Canarian xerophytic scrub

No value present in Expert System – relevé didn´t enter expert system classification (= it means that some prerequisites are missing)

“~” – relevé entered expert classification however was not classified to any EUNIS unit +

Clean info on Expert system column and separate it when there are several codes.

db_resurv <- db_resurv %>%
  mutate(
    # Clean 'Expert System' column by removing "!" and replacing "~" with NA
    `Expert System` = case_when(
      `Expert System` == "~" ~ NA_character_,  # Replace "~" with NA
      TRUE ~ str_replace_all(`Expert System`, "!", "")  # Remove "!"
    )
  ) %>%
  # Separate the values in 'Expert System' into multiple columns
  separate(
    `Expert System`,
    into = c("EUNISa", "EUNISb", "EUNISc", "EUNISd"),
    sep = ",",
    extra = "drop",  # Drop extra values if there are more than columns
    fill = "right",   # Fill missing values with NA for cases with fewer values
    remove = FALSE    # Keep the original 'Expert System' column
  )

Calculate how many different EUNIS codes have been assigned:

db_resurv <- db_resurv %>%
  mutate(
    # Count the number of non-NA values across the EUNIS columns
    n_EUNIS = rowSums(!is.na(select(., starts_with("EUNIS"))))
  )
ggplot(db_resurv, aes(n_EUNIS)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "Number of differnt EUNIS codes assigned") + coord_flip()

ggplot(db_resurv %>% filter(n_EUNIS > 0), aes(n_EUNIS)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "Number of differnt EUNIS codes assigned") + coord_flip()

Correct some EUNIS codes that are probably wrong:

db_resurv <- db_resurv %>%
  mutate(across(starts_with("EUNIS"), ~ case_when(
    . == "N16M" ~ "N16",
    . == "Sa" ~ "V4",
    . == "Sb" ~ "V5",
    . == "T1CT" ~ "T1C",
    . == "N15A" ~ "N15",
    TRUE ~ .
  )))

Add columns for the different EUNIS levels:

db_resurv <- db_resurv %>%
  mutate(
    # EUNISa levels
    EUNISa_1 = substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 2, 1)),
    EUNISa_2 = ifelse(
      nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 3, 2), 
      substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 3, 2)),
      NA_character_
    ),
    EUNISa_3 = ifelse(
      nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 4, 3), 
      substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 4, 3)),
      NA_character_
      ),
    EUNISa_4 = ifelse(
      nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 5, 4), 
      substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 5, 4)),
      NA_character_
    ),
    
    # EUNISb levels
    EUNISb_1 = substr(EUNISb, 1, ifelse(str_starts(EUNISb, "MA"), 2, 1)),
    EUNISb_2 = ifelse(
      nchar(EUNISb) >= ifelse(str_starts(EUNISb, "MA"), 3, 2), 
      substr(EUNISb, 1, ifelse(str_starts(EUNISb, "MA"), 3, 2)),
      NA_character_
    ),
    EUNISb_3 = ifelse(
      nchar(EUNISb) >= ifelse(str_starts(EUNISb, "MA"), 4, 3), 
      substr(EUNISb, 1, ifelse(str_starts(EUNISb, "MA"), 4, 3)),
      NA_character_
    ),
    EUNISb_4 = ifelse(
      nchar(EUNISb) >= ifelse(str_starts(EUNISb, "MA"), 5, 4), 
      substr(EUNISb, 1, ifelse(str_starts(EUNISb, "MA"), 5, 4)),
      NA_character_
    ),
    
    # EUNISc levels
    EUNISc_1 = substr(EUNISc, 1, ifelse(str_starts(EUNISc, "MA"), 2, 1)),
    EUNISc_2 = ifelse(
      nchar(EUNISc) >= ifelse(str_starts(EUNISc, "MA"), 3, 2), 
      substr(EUNISc, 1, ifelse(str_starts(EUNISc, "MA"), 3, 2)),
      NA_character_
    ),
    EUNISc_3 = ifelse(
      nchar(EUNISc) >= ifelse(str_starts(EUNISc, "MA"), 4, 3), 
      substr(EUNISc, 1, ifelse(str_starts(EUNISc, "MA"), 4, 3)),
      NA_character_
    ),
    EUNISc_4 = ifelse(
      nchar(EUNISc) >= ifelse(str_starts(EUNISc, "MA"), 5, 4), 
      substr(EUNISc, 1, ifelse(str_starts(EUNISc, "MA"), 5, 4)),
      NA_character_
    ),
    
    # EUNISd levels
    EUNISd_1 = substr(EUNISd, 1, ifelse(str_starts(EUNISc, "MA"), 2, 1)),
    EUNISd_2 = ifelse(
      nchar(EUNISd) >= ifelse(str_starts(EUNISd, "MA"), 3, 2), 
      substr(EUNISd, 1, ifelse(str_starts(EUNISd, "MA"), 3, 2)),
      NA_character_
    ),
    EUNISd_3 = ifelse(
      nchar(EUNISd) >= ifelse(str_starts(EUNISd, "MA"), 4, 3), 
      substr(EUNISd, 1, ifelse(str_starts(EUNISd, "MA"), 4, 3)),
      NA_character_
    ),
    EUNISd_4 = ifelse(
      nchar(EUNISd) >= ifelse(str_starts(EUNISd, "MA"), 5, 4), 
      substr(EUNISd, 1, ifelse(str_starts(EUNISd, "MA"), 5, 4)),
      NA_character_
    )
  )

Create new columns with descriptions for the level 1 codes:

db_resurv <- db_resurv %>%
  mutate(
    EUNISa_1_descr = case_when(
      EUNISa_1 == "V" ~ "Vegetated man-made habitats",
      EUNISa_1 == "U" ~ "Inland habitats with no or little soil",
      EUNISa_1 == "T" ~ "Forests and other wooded land",
      EUNISa_1 == "S" ~ "Heathlands, scrub and tundra",
      EUNISa_1 == "R" ~ "Grasslands",
      EUNISa_1 == "Q" ~ "Wetlands",
      EUNISa_1 == "P" ~ "Inland waters",
      EUNISa_1 == "N" ~ "Coastal habitats",
      EUNISa_1 == "MA" ~ "Marine habitats",
      TRUE ~ NA_character_
    ),
    EUNISb_1_descr = case_when(
      EUNISb_1 == "V" ~ "Vegetated man-made habitats",
      EUNISb_1 == "U" ~ "Inland habitats with no or little soil",
      EUNISb_1 == "T" ~ "Forests and other wooded land",
      EUNISb_1 == "S" ~ "Heathlands, scrub and tundra",
      EUNISb_1 == "R" ~ "Grasslands",
      EUNISb_1 == "Q" ~ "Wetlands",
      EUNISb_1 == "P" ~ "Inland waters",
      EUNISb_1 == "N" ~ "Coastal habitats",
      EUNISb_1 == "MA" ~ "Marine habitats",
      TRUE ~ NA_character_
    ),
    EUNISc_1_descr = case_when(
      EUNISc_1 == "V" ~ "Vegetated man-made habitats",
      EUNISc_1 == "U" ~ "Inland habitats with no or little soil",
      EUNISc_1 == "T" ~ "Forests and other wooded land",
      EUNISc_1 == "S" ~ "Heathlands, scrub and tundra",
      EUNISc_1 == "R" ~ "Grasslands",
      EUNISc_1 == "Q" ~ "Wetlands",
      EUNISc_1 == "P" ~ "Inland waters",
      EUNISc_1 == "N" ~ "Coastal habitats",
      EUNISc_1 == "MA" ~ "Marine habitats",
      TRUE ~ NA_character_
    ),
    EUNISd_1_descr = case_when(
      EUNISd_1 == "V" ~ "Vegetated man-made habitats",
      EUNISd_1 == "U" ~ "Inland habitats with no or little soil",
      EUNISd_1 == "T" ~ "Forests and other wooded land",
      EUNISd_1 == "S" ~ "Heathlands, scrub and tundra",
      EUNISd_1 == "R" ~ "Grasslands",
      EUNISd_1 == "Q" ~ "Wetlands",
      EUNISd_1 == "P" ~ "Inland waters",
      EUNISd_1 == "N" ~ "Coastal habitats",
      EUNISd_1 == "MA" ~ "Marine habitats",
      TRUE ~ NA_character_
    )
  )

Plot for EUNISa_1 (the first assigned EUNIS in cases of multiple assignations, level 1):

ggplot(db_resurv, aes(EUNISa_1_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 1") + coord_flip()

ggplot(db_resurv %>% filter(!is.na(EUNISa_1_descr)), aes(EUNISa_1_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 1") + coord_flip()
ggsave(filename=here("output", "figures","issue8.tiff"),
       width=18,height=10,units="cm",dpi=300)

ISSUE 9: Manipulated plots and info on manipulation type

ggplot(db_resurv, aes(`Manipulate (y/n)`)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "Manipulation")
ggsave(filename=here("output", "figures","issue9.tiff"),
       width=10,height=8,units="cm",dpi=300)

List of Type of Manipulation in manipulated plots (mixed information):

write_csv(data.frame(unique(db_resurv$`Type of manipulation`)),
          here("output", "csv","issue9.csv"))

ISSUE 10: Location method

ggplot(db_resurv, aes(`Location method`)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "Location method") + coord_flip()
ggsave(filename=here("output", "figures","issue10.tiff"),
       width=18,height=8,units="cm",dpi=300)

ISSUE 11: Resurvey project types

unique(db_resurv$RS_PROJTYP)
[1] "resampling"      "permanent"       "permanent (man)" "Permanent (man)"
[5] "Resampling"     

Unify codes:

db_resurv <- db_resurv %>%
  mutate(RS_PROJTYP = recode(RS_PROJTYP,
                             "Resampling" = "resampling",
                             "Permanent (man)" = "permanent (man)"))

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZGJfcmVzdXJ2IDwtIGRiX3Jlc3VydiAlPiVcbiAgbXV0YXRlKFJTX1BST0pUWVAgPSByZWNvZGUoUlNfUFJPSlRZUCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJSZXNhbXBsaW5nXCIgPSBcInJlc2FtcGxpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJQZXJtYW5lbnQgKG1hbilcIiA9IFwicGVybWFuZW50IChtYW4pXCIpKVxuYGBgIn0= -->

```r
db_resurv <- db_resurv %>%
  mutate(RS_PROJTYP = recode(RS_PROJTYP,
                             \Resampling\ = \resampling\,
                             \Permanent (man)\ = \permanent (man)\))
```

<!-- rnb-source-end -->
```r
db_resurv <- db_resurv %>%
  mutate(RS_PROJTYP = recode(RS_PROJTYP,
                             \Resampling\ = \resampling\,
                             \Permanent (man)\ = \permanent (man)\))

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMmR3Ykc5MEtHUmlYM0psYzNWeWRpd2dZV1Z6S0ZKVFgxQlNUMHBVV1ZBc0lHWnBiR3c5WUUxaGJtbHdkV3hoZEdVZ0tIa3ZiaWxnS1NrZ0sxeHVJQ0FnSUNBZ0lDQWdaMlZ2YlY5aVlYSW9ZV1Z6S0hrZ1BTQW9MaTVqYjNWdWRDNHVLU0F2SUhOMWJTZ3VMbU52ZFc1MExpNHBJQ29nTVRBd0tTa2dLMXh1SUNCc1lXSnpLSGtnUFNCY0lsQmxjbU5sYm5SaFoyVWdiMllnVW1WVGRYSjJaWGtnYjJKelpYSjJZWFJwYjI1elhDSXNYRzRnSUNBZ0lDQWdlQ0E5SUZ3aVVtVnpkWEoyWlhrZ2NISnZhbVZqZENCMGVYQmxYQ0lwSUNzZ1kyOXZjbVJmWm14cGNDZ3BJQ3RjYmlBZ2RHaGxiV1VvYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWENKMGIzQmNJaWxjYm1kbmMyRjJaU2htYVd4bGJtRnRaVDFvWlhKbEtGd2liM1YwY0hWMFhDSXNJRndpWm1sbmRYSmxjMXdpTEZ3aWFYTnpkV1V4TVM1MGFXWm1YQ0lwTEZ4dUlDQWdJQ0FnSUhkcFpIUm9QVEU0TEdobGFXZG9kRDA0TEhWdWFYUnpQVndpWTIxY0lpeGtjR2s5TXpBd0tWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKFJTX1BST0pUWVAsIGZpbGw9YE1hbmlwdWxhdGUgKHkvbilgKSkgK1xuICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgK1xuICBsYWJzKHkgPSBcIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zXCIsXG4gICAgICAgeCA9IFwiUmVzdXJ2ZXkgcHJvamVjdCB0eXBlXCIpICsgY29vcmRfZmxpcCgpICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXCJ0b3BcIilcbmdnc2F2ZShmaWxlbmFtZT1oZXJlKFwib3V0cHV0XCIsIFwiZmlndXJlc1wiLFwiaXNzdWUxMS50aWZmXCIpLFxuICAgICAgIHdpZHRoPTE4LGhlaWdodD04LHVuaXRzPVwiY21cIixkcGk9MzAwKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKFJTX1BST0pUWVAsIGZpbGw9YE1hbmlwdWxhdGUgKHkvbilgKSkgK1xuICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgK1xuICBsYWJzKHkgPSBcIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zXCIsXG4gICAgICAgeCA9IFwiUmVzdXJ2ZXkgcHJvamVjdCB0eXBlXCIpICsgY29vcmRfZmxpcCgpICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXCJ0b3BcIilcbmdnc2F2ZShmaWxlbmFtZT1oZXJlKFwib3V0cHV0XCIsIFwiZmlndXJlc1wiLFwiaXNzdWUxMS50aWZmXCIpLFxuICAgICAgIHdpZHRoPTE4LGhlaWdodD04LHVuaXRzPVwiY21cIixkcGk9MzAwKVxuYGBgIn0= -->

```r
ggplot(db_resurv, aes(RS_PROJTYP, fill=`Manipulate (y/n)`)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "Resurvey project type") + coord_flip() +
  theme(legend.position = "top")
ggsave(filename=here("output", "figures","issue11.tiff"),
       width=18,height=8,units="cm",dpi=300)

ISSUE 12: Column RS_DUPL

db_resurv %>% filter(!is.na(RS_DUPL)) %>% select(RS_CODE, RS_DUPL) %>%
  distinct()

ISSUE 13: Location uncertainty

db_resurv <- db_resurv %>%
  # Redefine precision_new, which was wrong
  mutate(precision_new = factor(ifelse(is.na(Lon_prec) & is.na(Lat_prec),
                                       0, 1)))
ggplot(db_resurv, aes(`Location uncertainty (m)`, fill = precision_new)) +
  geom_histogram( color = "black") +
  xlab("Location uncertainty (m)")

ggplot(db_resurv %>% filter(`Location uncertainty (m)` <= 500),
       aes(`Location uncertainty (m)`, fill = precision_new)) +
  geom_histogram(color = "black") +
  xlab("Location uncertainty (m) <= 500")
ggsave(filename=here("output", "figures","issue13_1.tiff"),
       width=18,height=8,units="cm",dpi=300)

ggplot(db_resurv %>% filter(`Location uncertainty (m)` > 500),
       aes(`Location uncertainty (m)`, fill = precision_new)) +
  geom_histogram(color = "black") +
  xlab("Location uncertainty (m) > 500")
ggsave(filename=here("output", "figures","issue13_2.tiff"),
       width=18,height=8,units="cm",dpi=300)

NO ISSUES FROM HERE

Altitude and slope values

Unique slope values:

unique((db_resurv)$`Slope (°)`) %>% str_sort()
 [1] "_"  "-"  "-1" "."  "0"  "0." "00" "03" "07" "1"  "1." "10" "11" "12"
[15] "13" "14" "15" "16" "17" "18" "19" "2"  "2." "20" "21" "22" "23" "24"
[29] "25" "26" "27" "28" "29" "3"  "30" "31" "32" "33" "34" "35" "36" "37"
[43] "38" "39" "4"  "4." "40" "41" "42" "43" "44" "45" "46" "47" "48" "5" 
[57] "5." "50" "51" "52" "55" "58" "6"  "6." "60" "65" "7"  "70" "75" "77"
[71] "78" "8"  "8." "80" "85" "9"  "9." "90" "95" NA  

Set altitude, slope and aspect as numeric:

db_resurv <- db_resurv %>%
  mutate(
    # Some altitude values have a "-" after the number,
    # convert to numeric after removing that
    Altitude = as.numeric(gsub("-", "", Altitude)),
    # Some slope values are noted as "_" or "-", these should be NA,
    # otherwise convert to numeric
    `Slope (°)` = ifelse(`Slope (°)` == "_" | `Slope (°)` == "-",
                   NA, as.numeric(`Slope (°)`)),
    # Convert aspect values to numeric
    `Aspect (°)` = as.numeric(`Aspect (°)`)
    )
Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Slope (°) = ifelse(`Slope (°)` == "_" | `Slope (°)` == "-",
  NA, as.numeric(`Slope (°)`))`.
Caused by warning in `ifelse()`:
! NAs introducidos por coerción

Histograms:

ggplot(db_resurv, aes(Altitude)) +
  geom_histogram(fill = "white", color = "black")

ggplot(db_resurv, aes(`Aspect (°)`)) +
  geom_histogram(fill = "white", color = "black")

ggplot(db_resurv, aes(`Slope (°)`)) +
  geom_histogram(fill = "white", color = "black")
ggsave(filename=here("output", "figures","issue8.tiff"),
       width=18,height=10,units="cm",dpi=300)


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKEFsdGl0dWRlKSkgK1xuICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gXCJ3aGl0ZVwiLCBjb2xvciA9IFwiYmxhY2tcIilcbmBgYCJ9 -->

```r
ggplot(db_resurv, aes(Altitude)) +
  geom_histogram(fill = \white\, color = \black\)
```

<!-- rnb-source-end -->
```r
ggplot(db_resurv, aes(Altitude)) +
  geom_histogram(fill = \white\, color = \black\)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIGV5Sm9aV2xuYUhRaU9qUXhPUzQyTlRNNUxDSjNhV1IwYUNJNk5qYzVMQ0prY0draU9pMHhMQ0p6YVhwbFgySmxhR0YyYVc5eUlqb3dMQ0pqYjI1a2FYUnBiMjV6SWpwYld6QXNJbHgxTURBeFlsc3pPRHMxT3pJMU5XMWdjM1JoZEY5aWFXNG9LV0FnZFhOcGJtY2dZR0pwYm5NZ1BTQXpNR0F1SUZCcFkyc2dZbVYwZEdWeUlIWmhiSFZsSUhkcGRHZ2dZR0pwYm5kcFpIUm9ZQzVjZFRBd01XSmJNemx0SWwwc1d6RXNJbGRoY201cGJtYzZJRngxTURBeFlsc3pPRHMxT3pJMU5XMVNaVzF2ZG1Wa0lETTBNRGt3TlNCeWIzZHpJR052Ym5SaGFXNXBibWNnYm05dUxXWnBibWwwWlNCdmRYUnphV1JsSUhSb1pTQnpZMkZzWlNCeVlXNW5aVnh1S0dCemRHRjBYMkpwYmlncFlDa3VYSFV3TURGaVd6TTViU0pkWFgwPSAtLT5cblxuPGltZyBzcmM9XFxkYXRhOmltYWdlL3BuZztiYXNlNjRcbiJ9 -->

<img src=:image/png;base64




<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIC0tPlxuXG48aW1nIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBdW9BQUFITkNBTUFBQUIvK0s2SEFBQUFzVkJNVkVVQUFBQUFBRG9BQUdZQU9wQUFacll6TXpNNkFBQTZBRG82a050TlRVMU5UVzVOVFk1TmJxdE5qc2htQUFCbUFEcG1aanBta0pCbXRyWm10djl1VFUxdVRXNXVUWTV1YmsxdWJxdHVqbzV1cStTT1RVMk9UVzZPVFk2T3lQK1FPZ0NRa0dhUTIvK3JiazJyYm02cjVQKzJaZ0MyMjVDMi83YTIvLy9JamszSS8vL2JrRHJiLzdiYi8vL2txMjdreU1qay8vL3I2K3YvdG1iL3lJNy8yNUQvNUt2Ly83Yi8vOGovLzl2Ly8rVC8vLyt5VmlrYUFBQUFDWEJJV1hNQUFCQWxBQUFRSlFFdUQyMTRBQUFRTkVsRVFWUjRuTzJkQzF2Yk9CWkEwK2ZXQmJxUFBxWXpNTER0aE4wQnRpa0xwQUgvL3grMmxwT3lCQnpMOXBVdFhkMXpQcVp1MWZSWVNRNGEyNEV3S3dGTU1JczlBWUJwSUhVd0FxbURFVWdkakVEcVlBUlNCeU1FU3YyL0hlbDh3ejRnMVNHTk5GRlNSenExbE5URklOVWhKWFV4U0hWSVNWME1VaDFTVWhlRFZJZVUxTVVnMVNFbGRURklkVWhKWFF4U0hWSlNGNE5VaDVUVXhTRFZJU1YxTVVoMVNFbGRERklkVWxJWGcxU0hsTlRGSU5VaEpYVXhTSFZJU1YwTVVoMVNVaGVEVkllVTFNVWcxU0cxbXZxc2taSHVMZElVcEdaVGI5S1FlczVTVWlkMUkxSlNKM1VqVWxJbmRTTlNVaWQxSTFKU0ozVWowanhTNzA5ejZsUFBBdXpBcW81MEtta2VxM3IvaVpHNk9TbXBrN29SS2FtVHVoRXBxWk82RVNtcGs3b1JLYW1UdWhFcHFaTzZFU21wazdvUkthbVR1aEVwcVpPNkVTbXBrN29SS2FtVHVoRXBxWk82RVNtcGs3b1JLYW1UdWhFcHFaTzZFU21wazdvUkthbVR1aEVwcVpPNkVTbXBrN29SS2FtVHVoRXBxWk82RVNtcGs3b1JLYW1UdWhFcHFaTzZFU21wazdvUkthbVR1aEVwcVpPNkVTbXBrN29SS2FtVHVoRXBxWk82RVNtcGs3b1JLYW1UdWhFcHFaTzZFU21wazdvUmFjcXBMejhVeFhGWjNuMHQ5czUzYkVnZGFVeG5vTlJYaDhmbDlkdDVlWGJnUHBvM3BJNDBwak5RNnRmN2w5WGlmYnc2bXBmTFQrZU5HMUpIR3RVWjhGaTlXdGxkMFZYWmpSdDNrMWNWSGt0VDFaMEhBVUxnaTJ1eGYrbEwzZEgvYzVCVjNadzA3VlY5VVoxNmtqclNaSjNCVWw5VUo2V2tqalJkWjZqVUYvWGxSRTVMa1NickRKVDY4dU42MWVaaUk5SlVuWUZTUHlzY3grWHFzSDYxcUhGRDZraGpPdm5DQURsSVZUaEpYUTVTRlU1U2w0TlVoWlBVNVNCVjRTUjFPVWhWT0VsZERsSVZUbEtYZzFTRms5VGxJRlhoSkhVNVNGVTRTVjBPVWhWT1VwZURWSVdUMU9VZ1ZlRWtkVGxJVlRoSlhRNVNGVTVTbDROVWhaUFU1U0JWNFNSMU9VaFZPRWxkRGxJVlRsS1hnMVNGazlUbElGWGhKSFU1U0ZVNFNWME9VaFZPVXBlRFZJV1QxT1VnVmVFa2RUbElWVGhKWFE1U0ZVNVNsNE5VaFpQVTVTQlY0U1IxT1VoVk9FbGREbElWVGxLWGcxU0ZrOVRsSUZYaEpIVTVTRlU0cDArOVAvemNVcGdXVm5Xa1UwbnpXTlg3VDR6VXpVbEpuZFNOU0VtZDFJMUlTWjNValVoSm5kU05TRW1kMUkxSVNaM1VqVWhKbmRTTlNFbWQxSTFJU1ozVWpVaEpuZFNOU0VtZDFJMUlTWjNValVoSm5kU05TRW1kMUkxSVNaM1VqVWhKbmRTTlNFbWQxSTFJU1ozVWpVaEpuZFNOU0VtZDFJMUlTWjNValVoSm5kU05TRW1kMUkxSVNaM1VqVWhKbmRTTlNFbWQxSTFJU1ozVWpVaEpuZFNOU0VtZDFJMUlTWjNValVoSm5kU05TRW1kMUkxSVNaM1VqVWhKbmRTTlNOTk9mZm5wdlBybFExSHNYNVozWDR1OTZrL2JHMUpIR3RNWkxQWFZvY3Y1K3FEK3c5bUIrM2kwSVhXa01aMmhVbDhVdjdwVi9leTNPdnVqdVZ2a3R6ZWtqalNxTTFUcTN5OWR6WGQvek4wZjNHK3J3TGMzN2k5ZVZiUlptdUhubHNLMGREaFdYeDM5VXJ5ZDcwN2QwZjl6a0ZYZG5EVGxWWDJkK3ZManZGejlmazdxU05OekJyNENVNVpQR3lkMXBDazRSMG1kMDFLazZUbkRwbjY5VngzRWZMN2tZaVBTOUp5QlYvVkZVYjlhdERwczJKQTYwcGhPdmpCQURsSVZUbEtYZzFTRms5VGxJRlhoSkhVNVNGVTRTVjBPVWhWT1VwZURWSVdUMU9VZ1ZlRWtkVGxJVlRoSlhRNVNGVTVTbDROVWhaUFU1U0JWNFNSMU9VaFZPRWxkRGxJVlRsS1hnMVNGazlUbElGWGhKSFU1U0ZVNFNWME9VaFZPVXBlRFZJV1QxT1VnVmVFa2RUbElWVGhKWFE1U0ZVNVNsNE5VaFpQVTVTQlY0U1IxT1VoVk9FbGREbElWVGxLWGcxU0ZrOVRsSUZYaEpIVTVTRlU0U1YwT1VoVk9VcGVEVklWellPby8vdnFsM2w0OS81UFVrYXB3Q2xPL0lIV2tTcHlEVWorZDNmT21iK21rampTT1U3aXFUd0kvdHhTbWhkTlNwRk5KRTFyVnk5dVQ5UUVNeCtwSWxUaUhwbjdhdjNGU1J4clRPZlJZL1YzLzgxRlNSeHJUT1RqMTk2U09kRFJwUXFuZm5yd2tkYVNqU1JOS3ZieWFEVjNXKzArTTFNMUpFMHI5eDdzWlYyQ1FqaVpOS0hVQi9TZEc2dWFrcEU3cVJxUUpwYzRCRE5JeHBRbWx2bUhBMS9DU090STRUdUVCekduL2E0NzlKMGJxNXFRSnBzNjNaaUExa2pyZm1vSFVSdW8vM25FQWcxU0pVM2dGNXNVM1VrZXF3OGwxZFRsSVZUaEpYUTVTRmM3QnFkKzhybzVmbmczNER0UCtFeU4xYzlLVVVyK3EzeXZnWXNEWE4vYWZHS21ia3lhVSt1M0orcnVRTHZxZmwvYWZHS21ia3lhVStzL3ZRdUlsSktTWnA4NnFqblJNYVVLcGM2eU9kRXhwU3FsekJRYnBpTktrVWg5TS80bVJ1amtwcVpPNkVXbFNxWjlXSjZSWEE5NklsOVNSeG5FT1RmMjB2dlRDVnpZaXpUMTFycXNqSFZPYVVPcjMxOVZKSGFrUzU5QURtUFVWOVp2WG9YOXF4cXdKVXJjbVRTbjFzYTZyTjJWTjZ1YWtTYVUrbVBhZGtUclNrWnlrTGdlcENtZTQxSmVmenN2eTdtdXh0MnRENmtoak9vT2x2anAwT1o4ZHVJL21EYWtqamVrTWxmcWkrTFZhMVZkSGM3ZTZOMjVJSFdsVVo2alV2MSs2bXBmcjNCczM3bGF2S3Rvc3pUdmg1NWJDdEhRNFZ2ZWw3bWovdkdKVlJ6cVNNK3hwS2FralRkWko2bktRcW5DR1RaM1RVcVRKT2dOZlYrZGlJOUpVbllGVFh4M1dyeFkxYmtnZGFVd25YeGdnQjZrS0o2bkxRYXJDU2VweWtLcHdrcm9jcENxY3BDNEhxUW9ucWN0QnFzSko2bktRcW5DU3VoeWtLcHlrTGdlcENpZXB5MEdxd2tucWNwQ3FjSks2SEtRcW5LUXVCNmtLSjZuTFFhckNTZXB5a0twd2tyb2NwQ3FjcEM0SHFRb25xY3RCcXNKSjZuS1FxbkNTdWh5a0tweWtMZ2VwQ2llcHkwR3F3a25xY3BDcWNKSzZIS1FxbktRdUI2a0tKNm5MUWFyQ1NlcHlrS3B3a3JvY3BDcWNwQzRIcVFvbnFjdEJxc0pKNm5LUXFuQ1N1aHlrS3B5a0xnZXBDdWYwcWJmRHp5MkYrTENxSTUxS21zZXEzcjR6VWtjNmtwUFU1U0JWNFNSMU9VaFZPRWxkRGxJVnpxeFNuelhSODk0T0FLa0taMTZwZTIrbjVyazJMaVYxVWpjaUpYVlNOeUlsZFZJM0lpVjFVamNpSlhWU055SWxkVkkzSWlYMUVWTnZ2Q2JmN1hVcU5RSHBrWkw2bUtsMzNVbkRBOVRwVmoyeExTVjFUNFdrbm91VTFEMFZrbm91VWxMM1ZFanF1VWhKM1ZNaHFlY2lKWFZQaGFTZWk1VFVQUldTZWk1U1VuODQySVMzVmxMWElTVjF6eUNwNXlJbGRjOGdxZWNpSlhYUElLbm5JaVYxenlDcDV5SWxkYzhncWVjaUpYWFBJS25uSWlWMXp5Q3A1eUlsZGM4Z3FlY2lKWFhQSUtubklpVjF6eUNwNXlJbGRjOGdxZWNpSlhYUFlPTll4MjhaSmZXVXBLVHVHUnkyMHUvZU1hbkhrcEs2WjVEVWM1RXFTSDM1b1NqMkw4dTdyOFhlZWZsb3M2RjlaNlNPZENSbjROU3ZEK3JOMllIN2VMVFowTDR6VWtjNmtqTnc2bWUvdVY5WFIvTnkrZWw4ZS9Qekp1MDdJM1drSXpuRHBuNzN4OXh0WE5oVjROc2I5eGV2S3RvTjA2UXUyUW5rVDRmbmZYWDBTL0Yydmp0MVIvdm5GYXM2MHBHY1lWZjE1Y2Q1dWZyOW5OVGwySmFtbjdyalNlT2tQZ1RiVWpXcGMxb3F4N1kwL2RTdjk4N0w1ZWRMTGpiS3NTMU5QL1Z5VWRTdkZxME9HelliMm5kRzZraEhjdktGQVMwN0p2VllVbEwzREpKNkxsSlM5d3lTZWk1U1V2Y01rbm91VWxMM0RKSjZMbEpTOXd5U2VpNVNVdmNNa25vdVVsTDNESko2TGxKUzl3eVNlaTVTVXZjTWtub3VVbEwzREpKNkxsSlM5d3lTZWk1U1V2Y01rbm91VWxMM0RKSjZMbEpTOXd5U2VpNVNVdmNNa25vdVVsTDNESko2TGxKUzl3eVNlaTVTVXZjTWtub3VVbEwzREpKNkxsSlM5d3lTZWk1U1V2Y01rbm91VWxMM0RKSjZMbEpTOXd5U2VpNVNVdmNNa25vdVVsTDNESko2TGxKUzl3eVNlaTVTVXZjTWtub3VVbEwzREpKNkxsSlM5d3lTZWk1U1V2Y01rbm91VWxMM0RKSjZMbEpTOXd5U2VpN1NQRkp2WjVyVUpUdUIvR0ZWSDd4YURNQzJOSTlWdlgxbnBJNTBKQ2VwdCt5WTFHTkpTZDB6U09xNVNFbmRNMGpxdVVoSjNUUFllYXlKeHAwRWVnZ0hZRnRLNnA3QjhCY2JBejJFQTdBdEpYWFBZUGpVbXhqd0VBN0F0cFRVUFlPVHZJUkU2aE5JU2QxWFllQXhVbzhsSlhWZmhZSEhTRDJXbE5SOUZRWWVJL1ZZVWxMM1ZSaDRqTlJqU1VuZFYySGdNVkx2SisxMndhcWZNeUNrM25jbkF4N0NBY1NTOXMvMVFlcWRIcTVBRXgxRDJocERmOXAzWmpEMTVyaWlwZDdwTGpkTFNYMmI5cDBwU0wwcmpYZXZpYWFka0hwNFNIMnNuVWp1SHFtUEFLbVB0UlBKM1F1ZWV2Zi83elROcHZVZmsvb3UybmRHNnB0L0xIaXlPeDhsZGI1aDY5MGo5VjIwNzR6VU4vOVlrcnBnMXQzdlh1ZXpqaUdRdW1lUTFQdnRwR0VzL09NNjZDNlF1dTloRFR4RzZnSEdCdDJGemIzdmZJYlJSOXAyaTdaSHBqL3RPeVAxelQ4MmwvcTRSMFFPVWg5cko1SzdaekgxME1JbmtQcFlPNUhjUFZLWEM1OUE2bVB0UkhZcHIyUHFvcDAwakpINnprZW1QMkh1c0lMVVJjTE9SSnRoMTdHdUlaTDZyaDFubm5vMlFsS1gzbUZTVnlJa2Rla2RKblVsd3ViRExzRXpUK3BqakNFY2F5ZUNaNTdVeHhoRE9OWk9CTTg4cVk4eGhuQ3NuUWllZVZJZll3emhXRHNSUFBOSnAzNzN0ZGc3di85VCs4NFNlMG9RanJNVDBhdHJDYWQrZHVBK2ZrTHFwb1RoZDlLWVRaZkxQT09udmpxYWw4dFA5OHM2cVpzU2h0OUo1LzhsVEorNnk5emx2b0hVVFFranpqcHE2cThxMm0vYy9Zcy9BSHJUTWRsSlZ2VStuNE1EUUtwRHF2UWI3a2dkYVFyTzFFNUwrMHhzQUVoMVNKV20zdXRpWTUrSkRRQ3BEcW5XMUZlSDNWOUM2ak94QVNEVklkV2EramJoSmpZQXBEcWtwQzRHcVE0cHFZdEJxa05LNm1LUTZwQ1N1aGlrT3FTa0xnYXBEaW1waTBHcVEwcnFZcERxa0pLNkdLUTZwS1F1QnFrT0thbUxRYXBEU3VwaWtPcVE1cEY2Vnp6ZnJwUVF6RFE0a1NkSzZqdGdwc0VoOVRSaHBzRWg5VFJocHNHeGxUcEFMRWdkakVEcVlBUlNCeU9RT2hpQjFNRUlVNmErL1pic0tWSy9pZE5tbXR1YnRGaCtLSXBqRFRPOUxvcTM4MFFtT21YcTIrK1NsQ0NyUS9jVWJLYTV2VW1LMWVGeGVWMGxsUHhNbHgvbjVYWDFtQ1l4MFFsVGYvVGVkK214S0g3ZHZCTmxOYzN0VGV5cGJYTzlmMWt0amNjS1pscldUM3NhRTUwdzlVZnZhSm9lM3kvZEZEZlQzTjdFbnRwVHFwVmR4MHdYKzVkcFRKVFVINklvOVdRS2FtZjU0ZTA4a1llVTFCK2lKL1hGbnBhWlZzZnFhVXlVMUIraUp2V0Z1NjZoWXFaUFoyZ2c5VlRQbXg3dzgxbUlmdzdWenFLK1dLZGhwalpQUzFPOEd2YUkraGxJNHNwWUsrNGFuaVA1bWJvTGpjdlBsMmxNZE1yVXQ5K1NQVVhxMURmVDNONGt4Vm5oT0ZZdzAwWFJNTU5JRStVTEE4QUlwQTVHSUhVd0FxbURFVWdkakVEcVlBUlNCeU9RT2hpQjFLTnlPbnZqTmovZXZTK3YzdGNidDkzbTZ0bVhDRFBMRDFLUHljMWYvdmI4ejdKT3ZjNTgvZHRITnlMMU1KQjZUQzZlLyt1MUs1dlVKNERVSTNKNzhyTDZLRjNmZjM4OW03MzR6N3YzTjV2dHB2bUwyZXpaUDEzcTFXL1d4em93RkZLUGlGdXZMMXpJbTFYOTRYLzFMNmZWNGMzVmJIT3JtOWUwTG9IVUkzTDY0bHRWOUp1ZHFkL1VSemVuejc3VU55cXY2dU42R0FpcHgyTzlUTHVWZTBmcTY3YXJ0WDk5dUw0dUh3WkM2dkZ3eDkrTzk3dFN2N2hQL2Y2V01CaFNqOGI2akxSSyttWEhWUjFFa0hvMGZ2Wjc0WTdGSDZYK3BqNWNXUit4clA4KzdseHpnTlNqNFU1S0hkVWhlNTM2bS92TWIwOWVmTHM5cVE1WDNJV1greXN3N3Z3MDhwUlZRK3F4K1A5SjV1bnpmN3NMaTV2cjZkWDIyNDkzczlrL25seFg1d0tNQ0ZJSEk1QTZHSUhVd1Fpa0RrWWdkVEFDcVlNUlNCMk1RT3BnQkZJSEk1QTZHT0Yvc3NyaUZFTUFrYm9BQUFBQVNVVk9SSzVDWUlJPVwiIC8+XG5cbjwhLS0gcm5iLXBsb3QtZW5kIC0tPlxuIn0= -->


<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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" />

<!-- rnb-plot-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMmR3Ykc5MEtHUmlYM0psYzNWeWRpd2dZV1Z6S0dCQmMzQmxZM1FnS01Ld0tXQXBLU0FyWEc0Z0lHZGxiMjFmYUdsemRHOW5jbUZ0S0dacGJHd2dQU0JjSW5kb2FYUmxYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5nZ3Bsb3QoZGJfcmVzdXJ2LCBhZXMoYEFzcGVjdCAowrApYCkpICtcbiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9IFxcd2hpdGVcXCwgY29sb3IgPSBcXGJsYWNrXFwpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
ggplot(db_resurv, aes(`Aspect (°)`)) +
  geom_histogram(fill = \white\, color = \black\)



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyZHdiRzkwS0dSaVgzSmxjM1Z5ZGl3Z1lXVnpLR0JCYzNCbFkzUWdLTUt3S1dBcEtTQXJYRzRnSUdkbGIyMWZhR2x6ZEc5bmNtRnRLR1pwYkd3Z1BTQmNYSGRvYVhSbFhGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBBc3BlY3QgKMKwKWApKSArXG4gIGdlb21faGlzdG9ncmFtKGZpbGwgPSBcXHdoaXRlXFwsIGNvbG9yID0gXFxibGFja1xcKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBBc3BlY3QgKMKwKWApKSArXG4gIGdlb21faGlzdG9ncmFtKGZpbGwgPSBcXHdoaXRlXFwsIGNvbG9yID0gXFxibGFja1xcKVxuYGBgXG5gYGAifQ== -->

```r
```r
ggplot(db_resurv, aes(`Aspect (°)`)) +
  geom_histogram(fill = \white\, color = \black\)
```
```

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIGV5Sm9aV2xuYUhRaU9qUXhPUzQyTlRNNUxDSjNhV1IwYUNJNk5qYzVMQ0prY0draU9pMHhMQ0p6YVhwbFgySmxhR0YyYVc5eUlqb3dMQ0pqYjI1a2FYUnBiMjV6SWpwYld6QXNJbHgxTURBeFlsc3pPRHMxT3pJMU5XMWdjM1JoZEY5aWFXNG9LV0FnZFhOcGJtY2dZR0pwYm5NZ1BTQXpNR0F1SUZCcFkyc2dZbVYwZEdWeUlIWmhiSFZsSUhkcGRHZ2dZR0pwYm5kcFpIUm9ZQzVjZFRBd01XSmJNemx0SWwwc1d6RXNJbGRoY201cGJtYzZJRngxTURBeFlsc3pPRHMxT3pJMU5XMVNaVzF2ZG1Wa0lETTROVEF6TWlCeWIzZHpJR052Ym5SaGFXNXBibWNnYm05dUxXWnBibWwwWlNCdmRYUnphV1JsSUhSb1pTQnpZMkZzWlNCeVlXNW5aVnh1S0dCemRHRjBYMkpwYmlncFlDa3VYSFV3TURGaVd6TTViU0pkWFgwPSAtLT5cblxuPGltZyBzcmM9XFxkYXRhOmltYWdlL3BuZztiYXNlNjRcbiJ9 -->

```

<!-- rnb-plot-begin eyJoZWlnaHQiOjQxOS42NTM5LCJ3aWR0aCI6Njc5LCJkcGkiOi0xLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbWzAsIlx1MDAxYlszODs1OzI1NW1gc3RhdF9iaW4oKWAgdXNpbmcgYGJpbnMgPSAzMGAuIFBpY2sgYmV0dGVyIHZhbHVlIHdpdGggYGJpbndpZHRoYC5cdTAwMWJbMzltIl0sWzEsIldhcm5pbmc6IFx1MDAxYlszODs1OzI1NW1SZW1vdmVkIDM4NTAzMiByb3dzIGNvbnRhaW5pbmcgbm9uLWZpbml0ZSBvdXRzaWRlIHRoZSBzY2FsZSByYW5nZVxuKGBzdGF0X2JpbigpYCkuXHUwMDFiWzM5bSJdXX0= -->

<img src=\data:image/png;base64
```



<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIC0tPlxuXG48aW1nIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBdW9BQUFITkNBTUFBQUIvK0s2SEFBQUFzVkJNVkVVQUFBQUFBRG9BQUdZQU9wQUFacll6TXpNNkFBQTZBRG82a050TlRVMU5UVzVOVFk1TmJtNU5icXROanNobUFBQm1BRHBtQUdabVpqcG1rSkJtdHY5dVRVMXVUVzV1VFk1dWJxdHVqbzV1cStTT1RVMk9UVzZPYnF1T3lQK1FPZ0NRdHBDUTIvK3JiazJyYm82cjVQKzJaZ0MyMjVDMi8vL0lqazNJcTI3STVLdkkvLy9ia0RyYi8vL2txMjdreU1qay8vL3I2K3YvdG1iL3lJNy8yNUQvNUt2Ly83Yi8vOGovLzl2Ly8rVC8vLy85Rm90Z0FBQUFDWEJJV1hNQUFCQWxBQUFRSlFFdUQyMTRBQUFVSDBsRVFWUjRuTzJkRFh2VXVCVkd3eTZ3REJUWXR1elNGaG9LVGJwcHlhWnBRaEx3Ly85aHRTZnprY2tJNWNxUzN5dmI1MzJ5TzJHd2p1NlZUNFRIQ2NOQlE4Z3NjdUJkQUNHYW9EcVpTVkNkekNTb1RtWVNWQ2N6Q2FxVG1TUlg5ZjlaWXo5eVNzUlJGRG54dGxGZFFoeEZrUk52RzlVbHhGRVVPZkcyVVYxQ0hFV1JFMjhiMVNYRVVSUTU4YlpSWFVJY1JaRVRieHZWSmNSUkZEbnh0bEZkUWh4RmtSTnZHOVVseEZFVU9mRzJVVjFDSEVXUkUyOGIxU1hFVVJRNThiWlJYVUljUlpFVGJ4dlZKY1JSRkRueHRsRmRRaHhGa1JOdkc5VWx4RkVVT2ZHMlVWMUNIRVdSRTI4YjFTWEVVUlE1OGJaUlhVSWNSWkVUYnh2VkpjUlJGRG54dGxGZFFvd2pEMExKSXZZS3FxUDYwTWpRNHFONmFTS3FTNGlvN2s5RWRRa1IxZjJKcUM0aG9yby9FZFVsUkZUM0o2SzZoSWpxL2tSVWx4QlIzWitJNmhJaXF2c1RVVjFDUkhWL0lxcExpS2p1VDBSMUNSSFYvWW1vTGlHaXVqOFIxU1ZFVlBjbm9ycUVpT3IrUkZTWEVGSGRuMWhLZFpLUm9PcnlLdVlTZHZWQmllenEva1JVbHhCUjNaK0k2aElpcXZzVFVWMUNSSFYvSXFwTGlLanVUMFIxQ1JIVi9ZbW9MaUdpdWo4UjFTVkVWUGNub3JxRWlPcitSRlNYRUZIZG42aFJQZmhPYlErZVRHc0xoVGhERWxIZG55aFNQVFFFMWRkQmRRVVIxU1ZFVlBjbm9ycUVpT3IrUkZTWEVGSGRuNGpxRWlLcSt4TlJYVUpFZFg4aXFrdUlxTzVQUkhVSkVkWDlpYWd1SWFLNlB4SFZKVVJVOXllaXVvU0k2djVFVkpjUVVkMmZpT29TSXFyN0UxRmRRa1IxZnlLcVM0aW83azlFZFFrUjFmMkpxQzRob3JvL0VkVWxSRlQzSjZLNmhJanEva1JVbHhCUjNaK0k2aElpcXZzVFVWMUNSSFYvSXFwTGlLanVUMFIxQ1JIVi9ZbW9MaUdpdWo4UjFTVkVWUGNub3JxRWlPcitSRlNYRUZIZG40anFFaUtxK3hOUlhVSkVkWDhpcWt1SXFPNVBSSFVKRWRYOWlhZ3VJYUs2UHhIVkpVUlU5eWVhVlAvMmFiSDQyL0xoeGVmN0Q2aWVqMFIxQmRHaytzbkw4NnRmajVxVFY5M0h2UWRVejBlaXVvSm9VZjNtL2RINjRlcnQ1OTBIVkMrQVJIVUYwYUw2eXVqdW9SVjg5d0hWQ3lCUlhVRzBxSDc1OHQrTHhlSDNWWC9TSmpMOGUvVGNWOExUU1ZCMWVSVnpTVlQxOWpYcDVmTWpkdldoa096cUNxSko5WmZuemJkUGg2ZytGQkxWRlVTTDZwM1ZyZXE4TEIwS2llb0tva1gxNXFTOWdIbnhtWnVOUXlGUlhVRTBxZDU5Qyttd2FXN2VMYjlwdFB1QTZ2bElWRmNRVGFvYkVwOEYxVkhkbllqcUVpS3EreE5SWFVKRWRYOGlxa3VJcU81UFJIVUpFZFg5aWFndUlhSzZQeEhWSlVSVTl5ZWl1b1NJNnY1RVZKY1FVZDJmaU9vU0lxcjdFMUZkUWtSMWZ5S3FTNGlvN2s5RWRRa1IxZjJKcUM0aG9yby9FZFVsUkZUM0o2SzZoSWpxL2tSVWx4QlIzWitJNmhJaXF2c1RVVjFDUkhWL0lxcExpS2p1VDBSMUNSSFYvWW1vTGlHaXVqOFIxU1ZFVlBjbm9ycUVpT3IrUkZTWEVGSGRuNGpxRWlLcSt4TlJYVUpFZFg4aXFrdUlxTzVQUkhVSkVkWDlpYWd1SWFLNlB4SFZKVVJVOXllaXVvU0k2djVFVkpjUVVkMmZpT29TSXFyN0UxRmRRa1IxZnlLcVM0aW83azlFZFFrUjFmMkpxQzRob3JvL0VkVWxSRlQzSjZLNmhJanEva1JVbHhCUjNaK0k2aElpcXZzVFVWMUNSSFYvSXFwTGlLanVUeXlsZWp4aDFRZWRja3dKcWk2dllpNWhWeCtVeUs3dVQwUjFDUkhWL1ltb0xpR2l1ajhSMVNWRVZQY25vcnFFaU9yK1JGU1hFRkhkbjRqcUVpS3EreE5SWFVKRWRYOGlxa3VJcU81UFJIVUpFZFg5aWFndUlhSzZQeEhWSlVSVTl5ZWl1b1NJNnY1RVZKY1FVZDJmaU9vU0lxcjdFMUZkUWtSMWZ5S3FTNGlvN2s5RWRRa1IxZjJKcUM0aG9yby9FZFVsUkZUM0o2SzZoSWpxL2tSVWx4QlIzWitJNmhJaXF2c1RVVjFDUkhWL0lxcExpS2p1VDBSMUNSSFYvWW1vTGlHaXVqOFIxU1ZFVlBjbm9ycUVpT3IrUkZTWEVGSGRuNGpxRWlLcSt4TlJYVUpFZFg4aXFrdUlxTzVQUkhVSkVkWDlpYWd1SWFLNlB4SFZKVVJVOXllaXVvU0k2djVFVkpjUVVkMmZpT29TSXFyN0UxRmRRa1IxZnlLcVM0aW83azlFZFFrUjFmMkpxQzRob3JvL0VkVWxSRlQzSjZLNmhJanEva1JVbHhCUjNaOW9WUDNxN2VlbStmWnA4V0x2QWRYemthaXVJSVpVdi83NTQvTHg0b2ZmMWsrZGRGYWZ2T28rN2oyZ2VqNFMxUlhFbU9xbkc5VXYvOUR1Nmpmdmo3cmRmZmNCMVFzZ1VWMUIzRmY5K0dDVFo2dW52djN6UDYzVVY3ZTY3ejUwdi8ya1RjamxPK2ZOL09Rc0UxUmRYc1ZjRXRyVk56bjcyMVZNOVM3eEx5aDJkWFoxZDJKSTlmdTUrZnM1cWcrSlJIVUZNYWo2MXcrM0Z6Q3JhL1dUd3diVmgwU2l1b0lZVlAxNGUrdWwyOVRmTGJvYzhySjBLQ1NxSzRnaDFhOWZQN3UvOEV1cHVkazRFQkxWRmNTdzZtK0NxcmZiKzR1OUIxVFBSNks2Z2hoUy9ldUh4eUUxbzRuUGd1cW83azRNcWQ1Y0hPeHQ2NmcrSUJMVkZjU1E2dGV2RDNidXdLRDZ3RWhVVnhCRHF2ZEpmQlpVUjNWM0lxcExpS2p1VHd5cHpnVk1jU0txK3hORHFxOXlrV0E2cXVjZ1VWMUJqS2plSENmY2M0elBndXFvN2s2TXFaNnlyY2RuUVhWVWR5ZkdWRDlGZFEwUzFSWEVpT3JYcjdtQTBTQlJYVUVNcWI2K0EvUGo3Nmd1UWFLNmdoaFN2VS9pczZBNnFyc1RVVjFDUkhWL1lsajFMMC9iNjVkSEgvZldIOVVIUWFLNmdoaFUvV0w1WGdHbktUL2ZHSjhGMVZIZG5SaFMvZXVIMjcrRmRKcnd1alErQzZxanVqc3hwUHI2YnlIeExTUVJFdFVWeEpEcTdPckZpYWp1VHd5cHpyVjZjU0txK3hPRHFuTUhSb3RFZFFVeHJIcDY0ck9nT3FxN0UxRmRRa1IxZjJKWTllUDJCZW5Gd2Q0Ykg2SDZNRWhVVnhDRHFoOHZiNzN3azQwcUpLb3JpQ0hWdWE5ZW5JanEvc1NRNnB2NzZxaXVRYUs2Z2hoU2ZYVkgvY3ZUaEl2MStDeW9qdXJ1eEtEcTNGZlhJb3VyZmhCTVZvMzlVdE81Q2F1ZW52Z3NxQzVXdmRkNmwvL2lxZXJjb0xxRU9IN1YrNTNCbXM3TnB1cGVnbThUbndYVlViMVFVTDFvVUwwUXNhcHpzNm02bCtEYnhHZEJkVlF2RkZRdkdsUXZSS3pxM0d5cTdpWDROdkZaVUIzVkN3WFZpd2JWQ3hHck9qZWJxbnNKdmsxOEZsUkg5VUpCOWFKQjlVTEVxczdOcHVwZWdtOFRud1hWVWIxUVVMMW9VTDBRc2FwenM2bTZsK0RieEdkQmRWUXZGRlF2R2xRdlJLenEzR3lxN2lXNE5lR0ZHblRLTVNXb2VtbGdiVVMzc0tzUFNtUlhMeFgvWFQwK0M2cWplcUdnZXRHZ2VpRmlWZWRtVTNVdndiZUp6NExxcUY0b3FGNDBxRjZJV05XNTJWVGRTL0J0NHJPZ09xb1hDcW9YRGFvWElsWjFialpWOXhKOG0vZ3NxSTdxaFlMcVJZUHFoWWhWblp0TjFiMEUzeVkrUzJXcVAvU21KcWhlaUlqcTFvVXl0cEE4NHFGeVVMMFFFZFd0QzJWc0lYa0Vxb3VJcUc1ZEtHTUx5U05RWFVSRWRldENHVnRJSG9IcUlpS3FXeGZLMkVMeUNGUVhFVkhkdWxER0ZwSkhvTHFJaU9yV2hUSzJrRHdDMVVWRVZMY3VsTEdGNUJHb0xpS2l1bldoakMwa2owQjFFUkhWclF0bGJDRjVCS3FMaUtodVhTaGpDOGtqVUYxRVJIWHJRaGxiU0I2QjZpSWlxbHNYeXRoQzhnaFVGeEZSM2JwUXhoYVNSNkM2aUlqcTFvVXl0cEE4QXRWRlJGUzNMcFN4aGVRUnFDNGlvcnAxb1l3dEpJOUFkUkVSMWEwTFpXd2hlUVNxaTRpb2JsMG9Zd3ZKSTFCZFJFUjE2MElaVzBnZWdlb2lJcXBiRjhyWVF2SUlWQmNSVWQyNlVNWVdra2VndW9pSTZ0YUZNcmFRUEFMVlJVUlV0eTZVc1lYa0VhZ3VJcUs2ZGFHTUxTU1BRSFVSRWRXdEMyVnNJWGtFcW91SXFHNWRLR01MeVNOUVhVUkVkZXRDR1Z0SUhvSHFJaUtxV3hmSzJFTHlDRlFYRVZIZHVsREdGcEpIb0xxSWlPcldoVEsya0R3QzFVVkVWTGN1bExHRjVCR29MaUtpdW5XaGpDMGtqMEIxRVJIVnJRdGxiQ0Y1QktxTGlLaHVYU2hqQzhralVGMUVSSFhyUWhsYlNCNVJYdldIL25VbFZDK1ZnVlcvK21XeE9HeWFiNThXTHo3ZmYwQjFDeEhWUzJWWTFXL2VIVGFYejQrYWsxZmR4NzJIVmVLem9EcXFGOHF3cWwrK1BHLzM4TU9iOTBmTjFkdlB1dy9yWStLem9EcXFGOHJ3MStydHp0NkozUXErKzdEKy9mZ3NxSTdxaFRLODZtY3Z6NytyK3BNMjhkSGhoWHBneXVGU3ZwdzhZbEQxM3JWOGIzQmxSTGM4VVBWWit3cVVYYjAva1YyOVZJYmUxYy9hRjZXb25rR2N1ZW9QM1lwTnlNQ3FueTN2S3ZLeXREOXg3cXFYTy8zRHFuNzE2KzNtemMzRzNrUlVMM1g2aDFYOVpOSGxzTGw1dC95bTBlN0RLdkZaVUIzVkM1MStmakFnS2FndUlxSjZWcS83TFNTUFFIVVJFZFd6ZXQxdklYa0Vxb3VJcUo3VjYzNEx5U05RWFVSRTlheGU5MXRJSG9IcUlpS3FaL1c2MzBMeUNGUVhFVkU5cTlmOUZwSkhvTHFJaU9wWnZlNjNrRHdDMVVWRVZNL3FkYitGNUJHb0xpS2llbGF2K3kwa2owQjFFUkhWczNyZGJ5RjVCS3FMaUtpZTFldCtDOGtqVUYxRVJQV3NYdmRiU0I2QjZpSWlxbWYxdXQ5QzhnaFVGeEZSUGF2WC9SYVNSNkM2aUlqcVdiM3V0NUE4QXRWRlJGVFA2blcvaGVRUnFDNGlvbnBXcnl0aXp0L01SWFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSY1REViszeGJaVE54cUpXRXhHZEJkVlF2ZFBxYjN1VnNEZ3VOVFVoOEZsUkg5VUtuSDlXVGlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLTlYzZm85UWxRUGpWd2ZGaHFia1Bnc3FGNUlkZU9CcUI0YXVUNHNORFloOFZsUUhkWDducXdnRWRVTERVYjFRa1JVeitxMUFCSFZnMEYxVStLem9EcXE5ejFaUVNLcUZ4cU02b1dJcUo3VmF3RWlxZ2VENnFiRVowRjFWTzk3c29KRVQ5WGpDVmZtUnF5c25PQ0JabUxXWUhORURlWUFyVVIyZFhaMWRuVlQ0ck9nT3FyM1BWbEJJcW9YR296cWhZaW9udFZyQVNLcUI0UHFwc1JuUVhWVTczdXlna1JVTHpRWTFRc1JVVDJyMXdKRVZBOEcxVTJKejRMcXFONzNaQVdKcUY1b01Lb1hJcUo2VnE4RmlLZ2VES3FiRXA4RjFWRzk3OGtLRWxHOTBHQlVMMFJFOWF4ZUN4QlJQUmhVTnlVK0M2cWpldCtURlNTaWVxSEJBNm9lL3VjZXJMMmdPcXFuRVQxVkR4NW83U1Y0b1BGckI5VWpxNTJTK0N5b1BxRHF4dWZDWHhOMzZhaHVTbndXVks5QjlZZG1RWFZUNHJPZ09xcW5ENDRRSjZDNitSL3BRL1hvNEY2em9Mb3A4Vm5zcWhjL3NFODVxSjdlWURpby90M0tVRDNhUzNuVkIvNVRGTlcvVzlrWVZPOTFkNjlXMVIrcU8zTzlVZjI3bFkxQzlkRGdoOHBCZGRNc0QvOGhnK3FXWHMyRFViM1VlcWVxL3ZBc3FHN3AxVHk0Q3RXdDEwbW9iaXduMm5OQzRyT2dlcnJxT1FlaWVxaVdXTThKaWM4eVZ0V3p0bFpVUi9XOFhoTVA3Rk5PRXovUStOdzhWYmZ2RHYxbVFYVkxyK2JCcFZRMzM1VTBFeFdEODM1V011dDFONnJuSE5pbm5GS3F1eDJvS3NlOHRsbURkdzVCZFV1djVzR29ianpRdkxaWmczY09RWFZMcitiQnFHNDgwTHkyV1lOM0RrRjFTNjhQREhhN3NrYjFoTE02VHRYTmJ1VzhUTEtYWTN4dURBZWllaURSVmhKU2gxdldpTXB4TzlCenZjMUVzeWVGZHJwb0t3bXBRL1dxWnFIQitJSGxQVUYxcDFsb01INWcrVDl1VWQxcEZocE1QaERWU3g5WVdUazBXR2dXVkhlYWhRYVREMFQxMGdkV1ZnNE5GcG9GMVoxbW9jSGtBMUc5OUlHVmxVT0RoV1pCZGFkWmFERDV3RXBWLy9acDhlTHo1bGVvWHRPQmxaVXpkdFZQWG5VZjY2QjZUUWRXVnM3SVZiOTVmOVJjdmQxczY2aGUwNEdWbFROeTFUdk5POTFYUWZXYURxeXNuT21vL3FSTi9HRHpqeHdTMGo4MmM0ZmQxZTkrYlptUG5CSnhGRVZPdkcxVWx4QkhVZVRFMis2dGV0TEwwaUtsanBrNGlpSW4zblp2MVpOdU5oWXBkY3pFVVJRNThiYjdxMzd6enY0dHBDS2xqcGs0aWlJbjNuWi8xWGNqS0hYTXhGRVVPZkcyVVYxQ0hFV1JFMjhiMVNYRVVSUTU4YlpSWFVJY1JaRVRieHZWSmNSUkZEbnh0bEZkUWh4RmtSTnZHOVVseEZFVU9mRzJVVjFDSEVXUkUyOGIxU1hFVVJRNThiWlJYVUljUlpFVGJ4dlZKY1JSRkRueHRsRmRRaHhGa1JOdnU1VHE1anp3OTVXcXlCaHFwTWkrUWZVN0dVT05GTmszcUg0blk2aVJJdnNHMWU5a0REVlNaTi9JVkNmRU42aE9aaEpVSnpNSnFwT1pCTlhKVElMcVpDYlJxTDc3bnV6Vlpma1dUcXNhS3kzMTZwZkY0ckQySWk4WGkrZEgxUmFwVVgzM2JaSnF5ODI3N3BTc2FxeXoxSnQzaDgxbHExSFZSVjc5ZXRSY3RrdFphWkVTMWUrOStWMWxPVnY4ZGZVK2xHMk5sWlo2K2ZLODNTVVA2eTZ5UzF0YXJVVktWTC8zbHFhVjViL25YWDJyR2lzdXRkM1o2eS95N09WNXJVV2llbk5iWDYwbmFKdUtMVnJuNnBmblI5V3VKS28zSTFIOTdNVUlpdXl1MVdzdEV0V2JjYWgrMXQzYnFMM0k1azUxMVJYSnk5Sm0rNlZZNDR1cFZjNlc5KzBxTDdMaFpXbDE5NTN1WlhsR0tyMUZkcHZ1UGw2WHFvdnNialJlL2VXODFpSTFxdSsrSjN0MVdhcStxckhPVWs4V1hRN3JMckk1Vzl5dHJyWWkrY0VBTXBPZ09wbEpVSjNNSktoT1poSlVKek1KcXBPWkJOWEpUSUxxWkNaQmRYV09ENTRaajd4NHMvcms2NGMzemNYQndadm0rdWVQUTVVMS9hQzZPRjkrK3RNUHY1bU92SDY5VnYzMGNYUDl4OS9haitiaXg5K0hLMjNpUVhWeFRuLzQxOU0zRHgvVzNGRzkrMlNsZXJlL2szNUJkVzIrZm5qY2ZuU2ZmWGw2MEYyVGZQbnBIKzBueTJ1YTA0TTduenp1ZnY5MkQ3L28vaGhZWHNDMHY4VzIzamVvcnMzRm80L05hZnRmYS9xYnp0ODNyZEhkaFhqN2krN3BMMCtmM1g1eS9mclpabGMvZnJ3N252UUtxbXR6M083S3JjYXJyYnBwYnVYdU51dmxzOTNUdDU5c0wyRFd2MTRkemhWTXo2QzZOTGRpSDdlYVg3KytkZjNXM1hhenZ0MnYyMSt1YmQ2cWZzZnVIZTlKU2xCZG11NHEvR0I1amQ1ZXRhK3UxVHZETzlYWHYzWDd6RmJ4blkwYzFYc0gxWlZadlNLOWZyMjYrajUrOUhHcit2b3FuRjE5bUtDNk1tdWRUeDl0TnU3VkpVMTNyYjY1dDhpMStoQkJkV1dPVjdjS1c3K1gxcmYvKy9LMC9XUnpCNmJiNTVlZnRQdi9Sbkh1d0JRSnFndXozWkxiRjZiZHRmbnk5dUtmbjk3ZU1sOWV5QzlmcXk3dnEzYy9RbkRudnZvcTNGZnZIVlIzanVHSzVNN0YrczUxTzBrS3FqdkhjdkY5dXJtQzRXZGcrZ2ZWbldOUmZmT1RML3hrWTBaUW5jd2txRTVtRWxRbk13bXFrNWtFMWNsTWd1cGtKa0YxTXBQOEgzZmFDaEZmWk1kZkFBQUFBRWxGVGtTdVFtQ0NcIiAvPlxuXG48IS0tIHJuYi1wbG90LWVuZCAtLT5cbiJ9 -->


<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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" />

<!-- rnb-plot-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMmR3Ykc5MEtHUmlYM0psYzNWeWRpd2dZV1Z6S0dCVGJHOXdaU0Fvd3JBcFlDa3BJQ3RjYmlBZ1oyVnZiVjlvYVhOMGIyZHlZVzBvWm1sc2JDQTlJRndpZDJocGRHVmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwWEc1blozTmhkbVVvWm1sc1pXNWhiV1U5YUdWeVpTaGNJbTkxZEhCMWRGd2lMQ0JjSW1acFozVnlaWE5jSWl4Y0ltbHpjM1ZsT0M1MGFXWm1YQ0lwTEZ4dUlDQWdJQ0FnSUhkcFpIUm9QVEU0TEdobGFXZG9kRDB4TUN4MWJtbDBjejFjSW1OdFhDSXNaSEJwUFRNd01DbGNibUJnWUNKOSAtLT5cblxuYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBTbG9wZSAowrApYCkpICtcbiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9IFxcd2hpdGVcXCwgY29sb3IgPSBcXGJsYWNrXFwpXG5nZ3NhdmUoZmlsZW5hbWU9aGVyZShcXG91dHB1dFxcLCBcXGZpZ3VyZXNcXCxcXGlzc3VlOC50aWZmXFwpLFxuICAgICAgIHdpZHRoPTE4LGhlaWdodD0xMCx1bml0cz1cXGNtXFwsZHBpPTMwMClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
ggplot(db_resurv, aes(`Slope (°)`)) +
  geom_histogram(fill = \white\, color = \black\)
ggsave(filename=here(\output\, \figures\,\issue8.tiff\),
       width=18,height=10,units=\cm\,dpi=300)

````

```r
ggplot(db_resurv, aes(`Slope (°)`)) +
  geom_histogram(fill = \white\, color = \black\)
ggsave(filename=here(\output\, \figures\,\issue8.tiff\),
       width=18,height=10,units=\cm\,dpi=300)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIGV5Sm9aV2xuYUhRaU9qUXhPUzQyTlRNNUxDSjNhV1IwYUNJNk5qYzVMQ0prY0draU9pMHhMQ0p6YVhwbFgySmxhR0YyYVc5eUlqb3dMQ0pqYjI1a2FYUnBiMjV6SWpwYld6QXNJbHgxTURBeFlsc3pPRHMxT3pJMU5XMWdjM1JoZEY5aWFXNG9LV0FnZFhOcGJtY2dZR0pwYm5NZ1BTQXpNR0F1SUZCcFkyc2dZbVYwZEdWeUlIWmhiSFZsSUhkcGRHZ2dZR0pwYm5kcFpIUm9ZQzVjZFRBd01XSmJNemx0SWwwc1d6RXNJbGRoY201cGJtYzZJRngxTURBeFlsc3pPRHMxT3pJMU5XMVNaVzF2ZG1Wa0lETTVNVE00T0NCeWIzZHpJR052Ym5SaGFXNXBibWNnYm05dUxXWnBibWwwWlNCdmRYUnphV1JsSUhSb1pTQnpZMkZzWlNCeVlXNW5aVnh1S0dCemRHRjBYMkpwYmlncFlDa3VYSFV3TURGaVd6TTViU0pkWFgwPSAtLT5cblxuPGltZyBzcmM9XFxkYXRhOmltYWdlL3BuZztiYXNlNjRcbiJ9 -->

<img src=:image/png;base64




<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIC0tPlxuXG48aW1nIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBdW9BQUFITkNBTUFBQUIvK0s2SEFBQUFwVkJNVkVVQUFBQUFBRG9BQUdZQU9wQUFacll6TXpNNkFBQTZBRG82a050TlRVMU5UVzVOVFk1TmJxdE5qc2htQUFCbUFEcG1BR1pta0pCbXR2OXVUVTF1VFc1dVRZNXViazF1YnF0dWpvNXVxK1NPVFUyT1RXNk9UWTZPeVArUU9nQ1F0cENRMi8rcmJrMnJibTZyNVArMlpnQzIvLy9JamszSS8vL2JrRHJiLy8va3EyN2t5TWprLy8vcjYrdi90bWIveUk3LzI1RC81S3YvLzdiLy84ai8vOXYvLytULy8vOGNJbmVIQUFBQUNYQklXWE1BQUJBbEFBQVFKUUV1RDIxNEFBQVQvRWxFUVZSNG5PMmRDM3NUUnhKRmxZU1FpRmQyeVdzeE1RdVJzVm12MThZSTV2Ly90TldNWkFVVHVaaFNsM3R1cWMvOStDTGpTS2R1VHg4bW83RnhaaDBoVFdRMmRRRkM2Z1RWU1NOQmRkSklVSjAwRWxRbmpRVFZTU01wVmYxL1l6UCttY0R1QlNaYzdYNWhxTjRhVExnYXFnT0xoQWxYUTNWZ2tURGhhcWdPTEJJbVhBM1ZnVVhDaEt1aE9yQkltSEExVkFjV0NST3VodXJBSW1IQzFWQWRXQ1JNdUJxcUE0dUVDVmREZFdDUk1PRnFxQTRzRWlaY0RkV0JSY0tFcTZFNnNFaVljRFZVQnhZSkU2Nkc2c0FpWWNMVlVCMVlKRXk0R3FvRGk0UUpWenNFMVdjN2N3L0xBVmFabGdoV1NmVmRMMEgxU1dEQzFWRGRzUnhnbFdtSllLamVHa3k0R3FvN2xnT3NNaTBSRE5WYmd3bFhRM1hIY29CVnBpV0NSYWx1WjdmcTl6cVNrTjNock40S1RMaGFqck82UFJiVmRXREMxVkRkc1J4Z2xXbUpZS2plR2t5NEdxbzdsZ09zTWkwUkROVmJnd2xYUTNYSGNvQlZwaVdDb1hwck1PRnFxTzVZRHJES3RFUXdWRzhOSmx3TjFSM0xBVmFabGdpRzZxM0JoS3VodW1NNXdDclRFc0ZRdlRXWWNEVlVkeXdIV0dWYUloaXF0d1lUcm9icWp1VUFxMHhMQkVQMTFtREMxVkRkc1J4Z2xXbUpZS2plR2t5NEdxbzdsZ09zTWkwUkROVmJnd2xYUTNYSGNvQlZwaVdDb1hwck1PRnFxTzVZRHJES3RFUXdWRzhOSmx3TjFSM0xBVmFabGdpRzZxM0JoS3VodW1NNXdDclRFc0ZRdlRXWWNEVlVkeXdIV0dWYUloaXF0d1lUcm9icWp1VUFxMHhMQkVQMTFtREMxVkRkc1J4Z2xXbUpZS2plR2t5NEdxbzdsZ09zTWkwUkROVmJnd2xYUTNYSGNvQlZwaVdDb1hwck1PRnFxTzVZRHJES3RFUXdWRzhOSmx3TjFSM0xBVmFabGdpRzZxM0JoS3VodW1NNXdDclRFc0ZRdlRXWWNEVlVkeXdIV0dWYUl0Z1kxYS9tZlY1MDF6L1A1MDh1dWs5djVvL1B1cHNIVkU4R0U2NDJ2ZXFEN2l1dHI1NE9INTQrN1gvZFBLQjZNcGh3TlFuVmwwZkhLN2xmREIrK1hIVFh2NTV0SGxBOUcweTRtb1RxNS8yRnk1K0wvc1BlNzVYbm00ZitNOSt2WXI5OHQrcjJhd2k1bDlqZWZYcHozSi9PZjVzL1d1eFF2WS85SjR5enVnNU11SnJDV1gyNFVybitaZEV0L3poRDlkd3c0V29LcXAvZnZQLzh5M0ZVVHdvVHJxYWcrdm9ONlZwMTNwYm1oZ2xYRTFCOXVGUWY3amRlLzM3QnpjYmNNT0ZxQXFwdkxsVE81OE1YalpaSG56K2dlaktZY0RVQjFVZkVIb3ZxT2pEaGFxanVXQTZ3eXJSRU1GUnZEU1pjRGRVZHl3RldtWllJaHVxdHdZU3JvYnBqT2NBcTB4TEJVTDAxbUhBMVZIY3NCMWhsV2lJWXFyY0dFNjZHNm83bEFLdE1Td1JEOWRaZ3d0VlEzYkVjWUpWcGlXQ28zaHBNdUJxcU81WURyREl0RVF6Vlc0TUpWME4xeDNLQVZhWWxncUY2YXpEaGFxanVXQTZ3eXJSRU1GUnZEU1pjRGRVZHl3RldtWllJaHVxdHdZU3JvYnBqT2NBcTB4TEJVTDAxbUhBMVZIY3NCMWhsV2lJWXFyY0dFNjZHNm83bEFLdE1Td1JEOWRaZ3d0VlEzYkVjWUpWcGlXQ28zaHBNdUJxcU81WURyREl0RVF6Vlc0TUpWME4xeDNLQVZhWWxncUY2YXpEaGFxanVXQTZ3eXJSRU1GUnZEU1pjRGRVZHl3RldtWllJaHVxdHdZU3JvYnBqT2NBcTB4TEJVTDAxbUhBMVZIY3NCMWhsV2lJWXFyY0dFNjZHNm83bEFLdE1Td1JEOWRaZ3d0VlEzYkVjWUpWcGlXQ28zaHBNdUZvTzFlM3NWdjFlUnhLeU81elZXNEVKVjh0eFZyZkhvcm9PVExnYXFqdVdBNnd5TFJFTTFWdURDVmREZGNkeWdGV21KWUtoZW1zdzRXcW83bGdPc01xMFJEQlVidzBtWEEzVkhjc0JWcG1XQ0licXJjR0VxNkc2WXpuQUt0TVN3VkM5Tlpod05WUjNMQWRZWlZvaUdLcTNCaE91aHVxTzVRQ3JURXNFUS9YV1lNTFZVTjJ4SEdDVmFZbGdxTjRhVExnYXFqdVdBNnd5TFJFTTFWdURDVmREZGNkeWdGV21KWUtoZW1zdzRXcW83bGdPc01xMFJEQlVidzBtWEEzVkhjc0JWcG1XQ0licXJjR0VxNkc2WXpuQUt0TVN3VkM5Tlpod05WUjNMQWRZWlZvaUdLcTNCaE91aHVxTzVRQ3JURXNFUS9YV1lNTFZVTjJ4SEdDVmFZbGdxTjRhVExnYXFqdVdBNnd5TFJFTTFWdURDVmREZGNkeWdGV21KWUtoZW1zdzRXcW83bGdPc01xMFJEQlVidzBtWEEzVkhjc0JWcG1XQ0licXJjR0VxNkc2WXpuQUt0TVN3VkM5Tlpod05WUjNMQWRZWlZvaUdLcTNCaE91aHVxTzVRQ3JURXNFRzZYNjljL3orWk9MN3RPYitlT3o3b3NIVkU4R0U2NG1vUHJWMCtIaDlHbi82NHNIVkU4R0U2NG1vUHJwaS82Znk1ZUw3dnJYczlzUHFKNE5KbHh0ZXRVLy9ibm9IM3F4VjRMZmZ1ai94ZmVyV0g5UzdxQ1h2ajBnWko5WTNpMWYvalovdExoYjlUNzJuekRPNmpvdzRXclRuOVd2ZjFsMHl6L09VUDBnWU1MVjZxdis0YWZYdytQbHQyOC9PN012VVAwZ1lNTFZwbFA5M1czVmVWdDZFRERoYXJWVlA1bHQ4K1A2TTFlUHo3cnIzeSs0MlhnUU1PRnEwNTNWdHptZkQxOHRXaDd0ZUVEMVpERGhhdE8vTFIwVGV5eXE2OENFcTAyZytzZFg2d3VZejY3VlVmMVFZTUxWSmxEOXhPRTRxaWVEQ1ZlYjRGcjkyWTllMDFFOURVeTQyaFNxUDBmMWc0VUpWNnV2K3NkWEQxRDlZR0hDMVNhNFZyK2N1VS9yOWxoVTE0RUpWNXZpQW1iR0haaURoUWxYNDc2Nll6bkFLdE1Td1ZDOU5aaHdOUzVnSE1zQlZwbVdDTFpMOVUwdVBWOUlzc2VpdWc1TXVOcDBGekFuam51TzlsaFUxNEVKVjV0T2RjOXAzUjZMNmpvdzRXclRxZjRPMVE4UUpseHRNdFUvUE9NQzVnQmh3dFdtdXdQejNYOVEvZkJnd3RXNHIrNVlEckRLdEVRd1ZHOE5KbHh0Q3RYZlAxeGR2M3p6K205Mm9ucCttSEMxU2I2enNmKzdHZTg4Mzk5b2owVjFIWmh3dGZxcWYzeTEvbHRJN3h6dlMrMnhxSzRERTY0MnhSMlk5ZW1jTHlFZElreTRHbWQxeDNLQVZhWWxndTFTbld2MVE0WUpWMnZxRHN4c1o4WXZweVNOd0lTck5YVmYzWG42VDNTZ1pXREMxVkFkMVNOaHd0V21VUDFrOVliMGN1YjV3VWYyV0ZUWGdRbFhtMEQxaytIV3l4VGYyWWpxOXc0VHJ0YlVmWFZVdjNlWWNMVUo3NnVqK2dIQ2hLdE5jQUd6dnFQKy9xSGpZdDBlaStvNk1PRnFiZDFYUi9YN2hnbFg0MllqcWtmQ2hLdWhPcXBId29Tcm9UcXFSOEtFcTZFNnFrZkNoS3VoT3FwSHdvU3JvVHFxUjhLRXE2RTZxa2ZDaEt1aE9xcEh3b1Nyb1RxcVI4S0VxNkU2cWtmQ2hLdWhPcXBId29TcjVWRGR6bTZEUzU1SXlKN2hyTjRLVExoYWpyTzZQUmJWZFdEQzFWQWQxU05od3RWUUhkVWpZY0xWVUIzVkkySEMxVkFkMVNOaHd0VlFIZFVqWWNMVlVCM1ZJMkhDMVZBZDFTTmh3dFZRSGRValljTFZVQjNWSTJIQzFWQWQxU05od3RWUUhkVWpZY0xWVUIzVkkySEMxUTVYOVYxQjlmdUdDVmM3WE5WSGZnN1ZVVDBDaHVxdHdZU3JvVHFxUjhLRXE2RTZxa2ZDaEt1aE9xcEh3b1Nyb1RxcVI4S0VxNkU2cWtmQ2hLdWgrdDMvTS9aRUIxb0dKbHdOMVhjK3NjS3hPVXlZY0RWVVIvVkltSEExVkVmMVNKaHdOVlJIOVVpWWNEVlVSL1ZJbUhBMVZFZjFTSmh3TlZSSDlVaVljRFZVUi9WSW1IQTFWRWYxU0pod05WUWZyZnJkWDFiZDY5aVVSQmNtWEEzVng2dCs1eFAzT2pZbDBZVUpWME4xVkkrRUNWZERkVlNQaEFsWFEzVlVqNFFKVjBOMVZJK0VDVmREZFZTUGhBbFhRM1ZVajRRSlYwTjFWSStFQ1ZkRGRWU1BoQWxYUTNWVWo0UUpWME4xVkkrRUNWZERkVlNQaEFsWFEzVlVqNFFKVjBOMVZJK0VDVmNUVVAzNjUvbjhlUDN3NUtMNzlHYisrS3k3ZVVEMVpERGhhdE9ydmp3NjdxNGVMYnFycDhOdlQ1LzJ2MjRlVUQwWlRMamE5S3BmRGFmeTQrNzBSZis3NWN0RmQvM3IyZVlCMWJQQmhLdE5yL29nK05IeHB6OFgvVWU5M3l2UE53LzlaNzVmeFg3MVBhaGU5RVRTY0w1bXhQbVRpK1hMMythUEZqdFU3MlAvQ2VPc3JnTVRyaVp4Vmo5ZnZRTzkvbVhSTGY4NFEvWGNNT0ZxQ3FxZlA5bzQvWmZqcUo0VUpseE5RUFh6N1YzRmxkeThMYzBORTY0MnZlcjlsY3NxVi8xRnpPOFgzR3pNRFJPdU5yM3FwL00reDkzNWZQaWkwZkxvOHdkVVR3WVRyamE5Nm1OaWowVjFIWmh3TlZSSDlVaVljRFZVUi9WSW1IQTFWRWYxU0pod05WUkg5VWlZY0RWVVIvVkltSEExVkVmMVNKaHdOVlJIOVVpWWNEVlVSL1ZJbUhBMVZDOVRmZlQvU1NQUnJ1blFFc0ZNeHh5eHgwNnArcDB2L3VxeEtZa3VUTGdhcXFONkpFeTRHcXFqZWlSTXVCcXFvM29rVExnYXFxTjZKRXk0R3FxamVpUk11QnFxbzNva1RMZ2FxcU42SkV5NEdxcWplaVJNdUJxcW8zb2tUTGdhcXFONkpFeTRHcXFqZWlSTXVCcXFvM29rVExnYXFxTjZKRXk0R3FxamVpUk11QnFxbzNva1RMZ2FxcU42SkV5NEdxcWplaVJNdUJxcTExRjk1OS9NRy8vWDliNTJvRXVDNmhFdzB6Rkg3TEVwVkI5ZFo2OERYUkpVajRDWm0rcUlQUmJWaTRMcUVUQnpVeDJ4eDZKNlVWQTlBbVp1cWlQMldGUXZDcXBId014TmRjUWVpK3BGUWZVSW1MbXBqdGhqVWIwb3FCNEJNemZWRVhzc3FoY0YxU05nNXFZNllvOUY5YUtnZWdUTTNGUkg3TEdvWGhSVWo0Q1ptK3FJUFJiVmk0THFFVEJ6VXgyeHg2SjZVVkE5QW1adXFpUDJXRlF2Q3FwSHdNeE5kY1FlaStwRlFmVUltTG1wanRoalViMG9xQjRCTXpmVkVYc3NxaGNGMVNOZzVxWTZZbzlGOWFLZ2VnVE0zTlN3M0lQcUpVK01uMEx5aExNNlovVURoNW1iNm9nOUZ0V0xndW9STUhOVEhiSEgzb1BxT3pQMnhXTTdvdm9Cd2N4TmRjUWVxM2F0UHJZanFoOFF6TnhVUit5eEI2LzYvajlhWUV4UVBRSm1icW9qOXRqRFYzM3NFL2NLcWtmQXpFMTF4QjZMNmtWQjlRaVl1YW1PMkdOUnZTaW9IZ0V6TjlVUmV5eXFGd1hWSTJEbXBqcGlqMjFVOWFpM3FxZ2VBVE0zMVJGN2JLT3FqeDN0M3JXaUpMSXpGR1p1cWlQMldGUTNSN3QzclNpSjdBeUZtWnZxaUQwVzFjM1I3bDByU2lJN1EySG1wanBpajBWMWM3UjcxNHFTeU01UW1MbXBqdGhqVWQwYzdkNjFvaVN5TXhSbWJxb2o5bGhVTjBlN2Q2MG9pZXdNaFptYjZvZzlGdFhOMGU1ZEswb2lPME5oNXFZNllvOUZkWE8wZTllS2tzak9VSmk1cVk3WVkxSGRITzNldGFJa3NqTVVabTZxSS9aWVZEZEh1M2V0S0luc0RJV1ptK3FJUFJiVnpkSHVYU3RLSWp0RFllYW1PbUtQUlhWenRIdlhpcExJemxDWXVhbU8yR05SM1J6dDNyV2lKTEl6RkdadXFpUDJXRlEzUjd0M3JTaUo3QXlGbVp2cWlEMVdUZldTSHplQTZrbGg1cVk2WW85VlU3MXNTdEVDUTNhdEtJbnNESVdabStxSVBSYlZyUmY3ZDYwb2lld01oWm1iNm9nOUZ0V3RGL3QzclNpSjdBeUZtWnZxaUQwVzFhMFgrM2V0S0luc0RJV1ptK3FJUFJiVnJSZjdkNjBvaWV3TWhabWI2b2c5RnRXdEYrLysyV0RXcmhVbGtaMmhNSE5USGJISG9ycjE0dDIzOUsxZEswb2lPME5oNXFZNllvOUZkZXZGcUY0RlptNnFJL1pZVkxkZWpPcFZZT2FtT21LUFBTelZSMzZwRmRXMVlPYW1PbUtQUFN6Vmk1NDQ5dkNnZWpUTTNDdEg3TEdvdnYzYzJNT0Q2dEV3YzY4Y3NjZWkrdlp6WXc4UHFrZkR6TDF5eEI2TDZ0dlBqVDA4OS9mLzRSQzJNM0xScUY1dlNxSHFPNG43N2ZwWEhOQ0JSUzRhMWV0TlFYVTNETldqbjRqcVlVSDFMNExxMjgrTlBUeW9YcmhvVks4M3BVM1ZTOTVab2pxcW02OHVkaUFVVnRJYjFWSGRmSFd4QTZHd1ExVDkwNXY1NDdQdDcreXhxTDc5WFBnUEt5aDNJQlIyaUtxZlB1MS8zY1FlaStwQlQ5eHYxNy9pd045MnkzRzF2Yi9xNDc5cnpydkFPNXFaUjliSzh1V2l1LzUxZTFxM3g0b3BJMWFuVFBYZC81MHdiUDI2NmlNbjc0U043MTJ5NkJHSlU3M1h2TmQ5RTN1c21ESmlkUXBWOTc3NDg3MGFmejAxVnFqRFZ2MzdWZXduanovekVMSnZScHA3djJkMTZ3OWJTWUJOVFVzRVEvWFdZTUxWUkZWM3ZTMnR0aHhnbFdtSllIdXI3cnJaV0cwNXdDclRFc0gyVjMxNU5QNUxTTldXQTZ3eUxSRnNmOVZ2UjJRNXdDclRFc0ZRdlRXWWNEVlVCeFlKRTY2RzZzQWlZY0xWVUIxWUpFeTRHcW9EaTRRSlYwTjFZSkV3NFdxb0Rpd1NKbHdOMVlGRndvU3JvVHF3U0pod05WUUhGZ2tUcm9icXdDSmh3dFZ5cUQ0NlgvbjdTaE9HWm50RXQ5cWR6VkNkWnZ0RXR4cXEzeDJhN1JIZGFxaCtkMmkyUjNTclRhODZJZE1HMVVralFYWFNTRkNkTkJKVUo0MEUxVWtqcWFQNjdaL0pMcFBybitmejQvWERrNHVweTl6S3BwTGdjYnVhOTNtaGQ5Q0duOE8xT1dBN2oxc2QxVy8vbUNTVkxJK091NnRIaSs1S3I5cW1rdVp4NjY1V0hxa2R0T1ZSTC9mbWdPMDhibFZVLytLSDM2bmthamh2SG5lbkw2WnU4cmVzSzRrZXQvNFVvWGJRenVmLzJ2d3cwZFVCMjMzY3Fxait4WTgwVmNwcTJ6NzlLZGRzVTBuMHVKMzNwd2l4Zy9iZmkvNWdiUTdZN3VQV3V1cXJiVnUrL0czK1NLdmNwcExtY2V2L1E5anBIVFJVdDNPK3VzQzcvbVhSTGYrUXVrellWTkk4YnNPbGdkNUJRM1V6NXpjbkpzRjJkMjdaMURtL2VjT25WVTFEZGRHM1Y4TTVmUjJ0WFJ1eXFxUjUzTFp2U0xVTzJyWEUyMUxSbTJiOWY0Uzc5YTJ6NjkrVmJoRnZLeWtldCtGU1hmQ2dEVzVQZnJQeGk1L0pycExUNGFzaHg5MzVYSzdkcHBMaWNkdWN5K1VPMnFENjVvRHRQRzU4WXdCcEpLaE9HZ21xazBhQzZxU1JvRHBwSktoT0dnbXFrMGFDNnFTUm9IcjlmSGcybTgyK2ZkdC84UHlyVC83NDZubDNPWnM5N3o3ODlMcEN0d01PcWxmUDVhd1gvT1NiMTZOVWYvZWcrL0NQdDZ0ZjNlVjMvN24vY2djY1ZLK2Vrd2Y5UHorK2VqQkc5ZjRwRzlYNzh6dlpQNmhlTzczam13eXFyNjVPWmo5MjNmc2YvdjF3K0dCMUlwOXRQbGpsc3IvUUdTNWdWcC9udEY0U1ZLK2V5OW1ONjczcS9lWE1oMmNQdXZjUFordmZkTzlXbHpidkgyNWNQM253MlF1LzRXcTlJS2hlUHl1cmgzZWx2ZW9mWC9WT3J5UmV5NzA2Y1g5NE5ueG1lRUszL3MzMmRWekJGQVRWSjhuSFY3UDEyOUsxdnF0L3JqOVlPYjgrZDIrMHZuVTFmOHQ3NGcycVQ1V1RiOTl1VmU4LytLRTN2RmQ5dHM3ZytLMFRPYW9YQmRWcjU4YmVsZFczenVwYjFUKy9JdWVzSGhkVXI1MmJPekNYdzFuOWkydjFrLzVhL1M2N3VWWXZDcXBYeitXc3YybDRPZnZ4aXpzd3E3UDU5ZzdNOEJXbVB0eUJDUXVxMTgvd2pRRzl0cmZ1cXovODU4UE5CZnE3emZjTjlMbTgrYURqdm5waFVGMGtkMXlkZkhZNU0rYmJDTWpkUVhXUjNIVWgvbTU3QmNQM3dKUUYxVVZ5bCtyYjczemhPeHNMZytxa2thQTZhU1NvVGhvSnFwTkdndXFra2FBNmFTU29UaHJKL3dITFh2RVhaSXVWMUFBQUFBQkpSVTVFcmtKZ2dnPT1cIiAvPlxuXG48IS0tIHJuYi1wbG90LWVuZCAtLT5cbiJ9 -->


<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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" />

<!-- rnb-plot-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


# Add columns date and year


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaR0pmY21WemRYSjJJRHd0SUdSaVgzSmxjM1Z5ZGlBbFBpVmNiaUFnYlhWMFlYUmxLR1JoZEdVZ1BTQmtiWGtvWUVSaGRHVWdiMllnY21WamIzSmthVzVuWUNrc0lIbGxZWElnUFNCNVpXRnlLR1JoZEdVcEtWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuZGJfcmVzdXJ2IDwtIGRiX3Jlc3VydiAlPiVcbiAgbXV0YXRlKGRhdGUgPSBkbXkoYERhdGUgb2YgcmVjb3JkaW5nYCksIHllYXIgPSB5ZWFyKGRhdGUpKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZGJfcmVzdXJ2IDwtIGRiX3Jlc3VydiAlPiVcbiAgbXV0YXRlKGRhdGUgPSBkbXkoYERhdGUgb2YgcmVjb3JkaW5nYCksIHllYXIgPSB5ZWFyKGRhdGUpKVxuYGBgIn0= -->

```r
db_resurv <- db_resurv %>%
  mutate(date = dmy(`Date of recording`), year = year(date))

Histograms:

ggplot(db_resurv, aes(year)) + geom_histogram(fill = "white", color = "black")

Plot size

ggplot(db_resurv, aes(`Relevé area (m²)`)) +
  geom_histogram(fill = "white", color = "black")

Observations with no info on plot size:

nrow(db_resurv %>% filter(is.na(`Relevé area (m²)`)))
[1] 19599

Cover values (total, trees, shrubs, herbs, mossess)

db_resurv %>%
  pivot_longer(cols = c(`Cover total (%)`, `Cover tree layer (%)`,
                        `Cover shrub layer (%)`, `Cover herb layer (%)`,
                        `Cover moss layer (%)`),
               names_to = "variable", values_to = "value") %>%
  ggplot(aes(x = value)) +
  geom_histogram(fill = "white", color = "black", bins = 10) +
  facet_wrap(~ variable, scales = "free") +
  labs(x = "Value", y = "Frequency")

db_resurv %>%
  reframe(across(c(`Cover total (%)`, `Cover tree layer (%)`,
                     `Cover shrub layer (%)`, `Cover herb layer (%)`,
                     `Cover moss layer (%)`), ~range(., na.rm = TRUE)))

All values OK.

Mosses and lichens identified

ggplot(db_resurv, aes(`Mosses identified (Y/N)`)) + geom_bar()

ggplot(db_resurv, aes(`Lichens identified (Y/N)`)) + geom_bar()

NA in most cases.

All resurveys for each resurvey plot to send to Bea

db_Europa<- db_resurv %>%
  group_by(RS_CODE, `ReSurvey site`,
           # If ReSurvey plot is not NA, 
           # group by RS_CODE, `ReSurvey site`, `ReSurvey plot`
           `ReSurvey plot` = ifelse(is.na(`ReSurvey plot`), 
                                    NA_character_, `ReSurvey plot`),
           # If ReSurvey plot is NA, group by coordinates
           # Create a unique grouping variable that uses coordinates
           # only when conditions are met
           group_coords = ifelse(is.na(`ReSurvey plot`),
                                 paste(Lon_updated, Lat_updated), NA_character_)
  ) %>%
  # Add unique identifiers for each plot.
  # These are based on the unique combination of RS_CODE, ReSurvey site and 
  # ReSurvey plot (When ReSurvey plot is not NA)
  # and on the unique combination of RS_CODE, ReSurvey site 
  # and updated coordinates (When ReSurvey plot is NA)
  mutate(plot_unique_id = cur_group_id()) %>%
  select(PlotObservationID, Country, `Date of recording`, RS_CODE,
         `ReSurvey site`, `ReSurvey plot`, Lon_updated, Lat_updated,
         group_coords, `Expert System`, `Location method`, plot_unique_id) %>%
  ungroup() %>%
  # Convert dates to date format and get the year
  mutate(date = dmy(`Date of recording`), year = year(date)) %>%
  select(-`Date of recording`, -date, -group_coords) %>%
  # Add unique identifiers for each observation
  mutate(obs_unique_id = row_number())
print(db_Europa, width = Inf)

Save to csv (file for us):

write_csv(db_Europa,here("data", "clean","db_Europa_20250107.csv"))

Save to csv (file for Bea, with only essential info):

write_csv(db_Europa %>% 
            select(obs_unique_id, plot_unique_id, Lon_updated, Lat_updated,
                   year),
          here("data", "clean","db_Europa_20241210_short.csv"))

Info on HabitatID from DK

Based on information got from Jesper.

Read the data sent by Jesper from DK

db_DK_J<-read_tsv(here("data", "raw",
                       "DK_Naturdata_Res_habitat_hab_codes_Jesper",
                  "DK_Naturdata_Res_habitat_hab_codes.txt"))
Rows: 158800 Columns: 9── Column specification ────────────────────────────────────────────────────
Delimiter: "\t"
chr (2): HABITAT, Dataset
dbl (7): PlotObservationID, RELEVE_NR, CIRC_ID, PLOT5_ID, PLOT15_ID, Acc...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Add info on HabitatID to db_resurv

db_resurv <- db_resurv %>%
  # Keeping all obs in db_resurv but not all in db_DK_J
  left_join(db_DK_J %>% select(PlotObservationID, HabitatID))
Joining with `by = join_by(PlotObservationID)`

List of HabitatID

print(db_resurv %>% distinct(HabitatID), n = 100)

Write csv:

write_csv(db_resurv %>% distinct(HabitatID),
          here("data", "clean","list_HabitatID_DK.csv"))

Cases without HabitatID info

Cases without ESy EUNIS habitat:

nrow(db_resurv %>% filter(is.na(`Expert System`)))/nrow(db_resurv)
[1] 0.6814982

Cases without ESy EUNIS habitat but with HabitatID from DK:

nrow(db_resurv %>% filter(is.na(`Expert System`)&!is.na(HabitatID)))/nrow(db_resurv)
[1] 0.2727117

Cases without ESy EUNIS habitat and without HABITAT from DK:

nrow(db_resurv %>% 
       filter(is.na(`Expert System`)&is.na(HabitatID)))/nrow(db_resurv)
[1] 0.4087865

Cases without ESy EUNIS habitat and without HabitatID from DK where data is presence / absence:

nrow(db_resurv %>%
       filter(is.na(`Expert System`) &
                is.na(HabitatID) &
                `Cover abundance scale` == "Presence/Absence"))/
  nrow(db_resurv)
[1] 0.1655851

Cases without ESy EUNIS habitat and without HabitatID from DK where data is not presence / absence:

nrow(db_resurv %>%
       filter(is.na(`Expert System`) &
                is.na(HabitatID) &
                `Cover abundance scale` != "Presence/Absence"))/
  nrow(db_resurv)
[1] 0.2432014

Change some Annex I habitat codes that were wrong

db_resurv <- db_resurv %>%
  mutate(HabitatID = as.character(HabitatID)) %>%
  mutate(HabitatID = ifelse(HabitatID == "9998", "91D0",
                            ifelse(HabitatID == "9999", "91E0", HabitatID)))

Add info on correspondences HabitatID (DK, Jesper) - EUNIS

Read correspondences file:

correspondences<-read_excel(here("data", "edited",
                                 "correspondence_HabitatID_DK.xlsx"))

Add info to db_resurv:

db_resurv <- db_resurv %>%
  # Keeping all obs in db_resurv but not all in db_DK_J
  left_join(correspondences %>% select(HabitatID, EUNIS))
Joining with `by = join_by(HabitatID)`

Correct NA values in EUNIS

db_resurv <- db_resurv %>%
  mutate(EUNIS = ifelse(EUNIS == "NA", NA, EUNIS))

Add info on EUNIS (DK) to EUNISa:

db_resurv <- db_resurv %>%
  mutate(EUNISa =
           # If EUNIS (DK) is available, add as EUNISa
           ifelse(!is.na(EUNIS), EUNIS, 
                  # Otherwise keep EUNISa
                  EUNISa),
         EUNIS_assignation = ifelse(!is.na(EUNIS), "Info from DK",
                                    ifelse(is.na(EUNISa), "Not possible",
                                           "Expert system"))) %>%
  # Remove column EUNIS (DK)
  select(-EUNIS)
ggplot(db_resurv, aes(EUNIS_assignation)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS assignation")

Generate file for ISSUE 5

write_csv(db_resurv %>%
            filter(is.na(`Expert System`)&is.na(HabitatID)),
          here("output", "csv","issue5.csv"))

Update columns for EUNIS levels and descriptions

Update the columns for the different EUNISs levels:

db_resurv <- db_resurv %>%
  mutate(
    # EUNISa levels
    EUNISa_1 = substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 2, 1)),
    EUNISa_2 = ifelse(
      nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 3, 2), 
      substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 3, 2)),
      NA_character_
    ),
    EUNISa_3 = ifelse(
      nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 4, 3), 
      substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 4, 3)),
      NA_character_
      ),
    EUNISa_4 = ifelse(
      nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 5, 4), 
      substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 5, 4)),
      NA_character_
    )
  ) %>%
  # Remove HabitatID column
  select(-HabitatID)

Update columns with descriptions for the level 1 codes:

db_resurv <- db_resurv %>%
  mutate(
    EUNISa_1_descr = case_when(
      EUNISa_1 == "V" ~ "Vegetated man-made habitats",
      EUNISa_1 == "U" ~ "Inland habitats with no or little soil",
      EUNISa_1 == "T" ~ "Forests and other wooded land",
      EUNISa_1 == "S" ~ "Heathlands, scrub and tundra",
      EUNISa_1 == "R" ~ "Grasslands",
      EUNISa_1 == "Q" ~ "Wetlands",
      EUNISa_1 == "P" ~ "Inland waters",
      EUNISa_1 == "N" ~ "Coastal habitats",
      EUNISa_1 == "MA" ~ "Marine habitats",
      TRUE ~ NA_character_
    )
  )

Number of different EUNIS codes

Recalculate how many different EUNIS codes have been assigned:

db_resurv <- db_resurv %>%
  mutate(
    # Count the number of non-NA values across the EUNIS columns
    n_EUNIS = rowSums(!is.na(select(., EUNISa:EUNISd)))
  )
ggplot(db_resurv, aes(n_EUNIS)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "Number of differnt EUNIS codes assigned") + coord_flip()

ggplot(db_resurv %>% filter(n_EUNIS > 0), aes(n_EUNIS)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "Number of differnt EUNIS codes assigned") + coord_flip()

New plot for EUNISa_1 (the first assigned EUNIS in cases of multiple assignations, level 1):

ggplot(db_resurv, aes(EUNISa_1_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 1") + coord_flip()

ggplot(db_resurv %>% filter(!is.na(EUNISa_1_descr)), aes(EUNISa_1_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 1") + coord_flip()

Add info on descriptions for EUNIS levels 2-4

descriptions<-read_excel(here("data", "edited",
                                 "EUNIS-Habitats-2021-06-01_modified.xlsx"))
# Define the columns and corresponding description column names
eunis_cols <- c("EUNISa_2", "EUNISa_3", "EUNISa_4",
                "EUNISb_2", "EUNISb_3", "EUNISb_4", 
                "EUNISc_2", "EUNISc_3", "EUNISc_4",
                "EUNISd_2", "EUNISd_3", "EUNISd_4")

# Create corresponding description column names
descr_col_names <- paste0(eunis_cols, "_descr")

# Use reduce to loop through the columns and join dynamically based on level
db_resurv <- reduce(seq_along(eunis_cols), function(data, i) {
  # Extract level number from the column name (e.g., EUNISa_2 -> 2)
  level <- as.numeric(gsub("\\D", "", eunis_cols[i]))
  
  # Filter descriptions for the corresponding level
  descriptions_level <- descriptions %>%
    filter(level == level) %>%
    select(`EUNIS 2020 code`, `EUNIS-2021 habitat name`)
  
  # Perform the left_join and rename the column dynamically
  data %>%
    left_join(
      descriptions_level,
      by = setNames("EUNIS 2020 code", eunis_cols[i])
    ) %>%
    rename(!!descr_col_names[i] := `EUNIS-2021 habitat name`)
}, .init = db_resurv)

The matching did not work sometimes, correct!

# Correct EUNISa levels 2-4 descriptions
db_resurv <- db_resurv %>%
  mutate(EUNISa_2_descr = 
           ifelse(!is.na(EUNISa_2_descr), EUNISa_2_descr,
                  case_when(
                    EUNISa_2 == "Pf" ~ "Fresh-water submerged vegetation",
                    EUNISa_2 == "Pj" ~ "Stonewort vegetation",
                    EUNISa_2 == "R4" ~ "Alpine and subalpine grasslands",
                    EUNISa_2 == "Pb" ~ "Calcareous spring and spring brook",
                    EUNISa_2 == "Qb" ~ "Wetlands",
                    EUNISa_2 == "R3" ~ "Seasonally wet and wet grasslands",
                    EUNISa_2 == "Qa" ~ "Mires",
                    EUNISa_2 == "Pa" ~ "Base-poor spring and spring brook",
                    EUNISa_2 == "Ph" ~ "Oligotrophic-water vegetation",
                    EUNISa_2 == "Pg" ~ "Fresh-water nymphaeid vegetation",
                    EUNISa_2 ==
                      "Pd" ~ "Fresh-water small pleustophyte vegetation",
                    EUNISa_2 == "Pc" ~ "Brackish-water vegetation",
                    EUNISa_2 ==
                      "Pe" ~ "Fresh-water large pleustophyte vegetation",
                    EUNISa_2 == "Pi" ~ "Dystrophic-water vegetation",
                    EUNISa_2 == "S1" ~ "Tundra",
                    EUNISa_2 ==
                      "U7" ~ "Unvegetated or sparsely vegetated gravel bars",
                    EUNISa_2 == "Q6" ~ "Periodically exposed shores",
                    TRUE ~ NA_character_)
                  ),
         EUNISa_3_descr = 
           ifelse(!is.na(EUNISa_3_descr), EUNISa_3_descr,
                  case_when(
                    EUNISa_3 =="U71" ~ "Unvegetated or sparsely vegetated gravel bar in montane and alpine regions",
                    EUNISa_3 =="Q61" ~ "Periodically exposed shore with stable, eutrophic sediments with pioneer or ephemeral vegetation",
                    EUNISa_3 =="Q62" ~ "Periodically exposed shore with stable, mesotrophic sediments with pioneer or ephemeral vegetation",
                    TRUE ~ NA_character_
                    ))
         )
# Correct EUNISb levels 2-4 descriptions
db_resurv <- db_resurv %>%
  mutate(EUNISb_2_descr = 
           ifelse(!is.na(EUNISb_2_descr), EUNISb_2_descr,
                  case_when(
                    EUNISb_2 == "Pj" ~ "Stonewort vegetation",
                    EUNISb_2 == "R4" ~ "Alpine and subalpine grasslands",
                    EUNISb_2 == "Pf" ~ "Fresh-water submerged vegetation",
                    TRUE ~ NA_character_)
                  )
         )

EUNISc and EUNISd levels 2-4 are OK.

Notes EUNIS codes - to change?

https://www.sci.muni.cz/botany/chytry/Schaminee_etal2021_EEA-Report-Aquatic-Wetland-habitats.pdf

EUNISa_2 == “Q6” : “Periodically exposed shores” EUNISa_3 = “Q61” : “Periodically exposed shore with stable, eutrophic sediments with pioneer or ephemeral vegetation” EUNISa_3 == “Q62” : “Periodically exposed shore with stable, mesotrophic sediments with pioneer or ephemeral vegetation”

This classification of Q + numbers is now coexisting in the database with Qa & Qb (metadata). How to proceed?

db_resurv %>% filter(EUNISa_1 == "Q") %>% distinct(EUNISa_2)

Plots of level-2 categories within each level 1 category

ggplot(db_resurv %>% filter(EUNISa_1 == "MA"), aes(EUNISa_2_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 2") + coord_flip() +
  ggtitle(db_resurv %>% filter(EUNISa_1 == "MA") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","MA_level2.tiff"),
       width=14,height=8,units="cm",dpi=300)

ggplot(db_resurv %>% filter(EUNISa_1 == "N"), aes(EUNISa_2_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 2") + coord_flip() +
  ggtitle(db_resurv %>% filter(EUNISa_1 == "N") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","N_level2.tiff"),
       width=14,height=8,units="cm",dpi=300)

ggplot(db_resurv %>% filter(EUNISa_1 == "P"), aes(EUNISa_2_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 2") + coord_flip() +
  ggtitle(db_resurv %>% filter(EUNISa_1 == "P") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","P_level2.tiff"),
       width=14,height=8,units="cm",dpi=300)

ggplot(db_resurv %>% filter(EUNISa_1 == "Q"), aes(EUNISa_2_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 2") + coord_flip() +
  ggtitle(db_resurv %>% filter(EUNISa_1 == "Q") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","Q_level2.tiff"),
       width=14,height=8,units="cm",dpi=300)

ggplot(db_resurv %>% filter(EUNISa_1 == "R"), aes(EUNISa_2_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 2") + coord_flip() +
  ggtitle(db_resurv %>% filter(EUNISa_1 == "R") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","R_level2.tiff"),
       width=14,height=8,units="cm",dpi=300)

ggplot(db_resurv %>% filter(EUNISa_1 == "S"), aes(EUNISa_2_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 2") + coord_flip() +
  ggtitle(db_resurv %>% filter(EUNISa_1 == "S") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","S_level2.tiff"),
       width=16,height=8,units="cm",dpi=300)

ggplot(db_resurv %>% filter(EUNISa_1 == "T"), aes(EUNISa_2_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 2") + coord_flip() +
  ggtitle(db_resurv %>% filter(EUNISa_1 == "T") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","T_level2.tiff"),
       width=14,height=8,units="cm",dpi=300)

ggplot(db_resurv %>% filter(EUNISa_1 == "U"), aes(EUNISa_2_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 2") + coord_flip() +
  ggtitle(db_resurv %>% filter(EUNISa_1 == "U") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","U_level2.tiff"),
       width=16,height=8,units="cm",dpi=300)

ggplot(db_resurv %>% filter(EUNISa_1 == "V"), aes(EUNISa_2_descr)) +
         geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
  labs(y = "Percentage of ReSurvey observations",
       x = "EUNIS level 2") + coord_flip() +
  ggtitle(db_resurv %>% filter(EUNISa_1 == "V") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","V_level2.tiff"),
       width=14,height=8,units="cm",dpi=300)

Session info

sessionInfo()
R version 4.4.2 (2024-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 10 x64 (build 19045)

Matrix products: default


locale:
[1] LC_COLLATE=Spanish_Spain.utf8  LC_CTYPE=Spanish_Spain.utf8   
[3] LC_MONETARY=Spanish_Spain.utf8 LC_NUMERIC=C                  
[5] LC_TIME=Spanish_Spain.utf8    

time zone: Europe/Paris
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] readxl_1.4.3    purrr_1.0.2     stringr_1.5.1   ggplot2_3.5.1  
[5] lubridate_1.9.4 dplyr_1.1.4     tidyr_1.3.1     readr_2.1.5    
[9] here_1.0.1     

loaded via a namespace (and not attached):
 [1] sass_0.4.9        utf8_1.2.4        generics_0.1.3    stringi_1.8.4    
 [5] hms_1.1.3         digest_0.6.37     magrittr_2.0.3    evaluate_1.0.1   
 [9] grid_4.4.2        timechange_0.3.0  fastmap_1.2.0     cellranger_1.1.0 
[13] rprojroot_2.0.4   jsonlite_1.8.9    fansi_1.0.6       scales_1.3.0     
[17] jquerylib_0.1.4   cli_3.6.3         rlang_1.1.4       crayon_1.5.3     
[21] bit64_4.5.2       munsell_0.5.1     withr_3.0.2       cachem_1.1.0     
[25] yaml_2.3.10       tools_4.4.2       parallel_4.4.2    tzdb_0.4.0       
[29] colorspace_2.1-1  vctrs_0.6.5       R6_2.5.1          lifecycle_1.0.4  
[33] bit_4.5.0.1       vroom_1.6.5       pkgconfig_2.0.3   pillar_1.9.0     
[37] bslib_0.8.0       gtable_0.3.6      glue_1.8.0        xfun_0.49        
[41] tibble_3.2.1      tidyselect_1.2.1  knitr_1.49        farver_2.1.2     
[45] htmltools_0.5.8.1 rmarkdown_2.29    labeling_0.4.3    compiler_4.4.2   
LS0tDQp0aXRsZTogIlNjcmlwdCB0byBtYWtlIGEgZmlyc3QgY2hlY2sgb2YgdGhlIE1PVElWQVRFIGRhdGFiYXNlIg0Kb3V0cHV0Og0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KLS0tDQoNCiMgTG9hZCBsaWJyYXJpZXMNCg0KYGBge3J9DQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkocHVycnIpDQpsaWJyYXJ5KHJlYWR4bCkNCmBgYA0KDQojIFJlYWQgdGhlIGRhdGENCg0KYGBge3J9DQpkYjwtcmVhZF90c3YoaGVyZSgiZGF0YSIsICJyYXciLA0KICAgICAgICAgICAgICAgICAgIjIwMF9NT1RJVkFURTIwMjQwNDEyX2hlYWRlcl9ub3RKVUlDRV93aXRoX3ByZWNpc2VfY29vcmRpbmF0ZXMuY3N2IikpDQpgYGANCg0KIyBQcm9ibGVtcyAoZG8gbm90IGFmZmVjdCB1cykNCg0KYGBge3J9DQpwcm9ibGVtczwtcHJvYmxlbXMoZGIpDQpzb3J0KHVuaXF1ZShwcm9ibGVtcyRjb2wpKQ0KbmFtZXMoZGJbNTI6NjldKQ0KYGBgDQoNCldlIHdpbGwgbm90IHVzZSB0aGVzZSBjb2x1bW5zLCBzbyBubyBwcm9ibGVtIQ0KDQojIEZpbHRlciB0byBnZXQgb25seSByZXN1cnZleXMNCg0KYGBge3J9DQpkYl9yZXN1cnYgPC0gZGIgJT4lIGZpbHRlcihgUmVTdXJ2ZXkgcGxvdCAoWS9OKWAgPT0gIlkiKQ0KYGBgDQoNCiMgVXBkYXRlIGNvb3JkaW5hdGVzDQoNCkNyZWF0ZSBuZXcgY29sdW1uIHdpdGggb2xkIGNvb3JkaW5hdGVzIGlmIG5ldyBub3QgYXZhaWxhYmxlLCBhbmQgd2l0aCBuZXcgaWYgYXZhaWxhYmxlLg0KDQpgYGB7cn0NCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogIG11dGF0ZShMb25fdXBkYXRlZCA9IGlmZWxzZShpcy5uYShMb25fcHJlYyksTG9uZ2l0dWRlLExvbl9wcmVjKSwNCiAgICAgICAgIExhdF91cGRhdGVkID0gaWZlbHNlKGlzLm5hKExhdF9wcmVjKSxMYXRpdHVkZSxMYXRfcHJlYykpDQpgYGANCg0KYGBge3J9DQpwcmludChkYl9yZXN1cnYsIHdpZHRoID0gSW5mKQ0KYGBgDQoNClNhdmUgdG8gY3N2Og0KDQpgYGB7cn0NCndyaXRlX2NzdihkYl9yZXN1cnYsaGVyZSgiZGF0YSIsICJjbGVhbiIsImRiX3Jlc3Vydi5jc3YiKSkNCmBgYA0KDQojIElTU1VFIDE6IFJlU3VydmV5IHBsb3QgaXMgTkENCg0KQ2FyZWZ1bCEgU29tZXRpbWVzIFJlU3VydmV5IHBsb3QgaXMgTkEuIA0KDQpgYGB7cn0NCm5yb3coZGJfcmVzdXJ2JT4lZmlsdGVyKGlzLm5hKFJTX0NPREUpKSkNCm5yb3coZGJfcmVzdXJ2JT4lZmlsdGVyKGlzLm5hKGBSZVN1cnZleSBzaXRlYCkpKQ0KbnJvdyhkYl9yZXN1cnYlPiVmaWx0ZXIoaXMubmEoYFJlU3VydmV5IHBsb3RgKSkpDQpgYGANCg0KYGBge3J9DQp3cml0ZV9jc3YoZGJfcmVzdXJ2ICU+JSBmaWx0ZXIoaXMubmEoYFJlU3VydmV5IHBsb3RgKSksDQogICAgICAgICAgaGVyZSgib3V0cHV0IiwgImNzdiIsImlzc3VlMS5jc3YiKSkNCmBgYA0KDQojIElTU1VFIDI6IENvb3JkaW5hdGVzIGFyZSBOQQ0KDQpDb29yZGluYXRlcyBhcmUgYWxzbyBOQSBpbiBzb21lIGNhc2VzLg0KDQpgYGB7cn0NCm5yb3coZGJfcmVzdXJ2JT4lZmlsdGVyKGlzLm5hKExvbl91cGRhdGVkKSAmIGlzLm5hKExhdF91cGRhdGVkICkpKQ0KYGBgDQoNCmBgYHtyfQ0Kd3JpdGVfY3N2KGRiX3Jlc3VydiAlPiUgZmlsdGVyKGlzLm5hKExvbl91cGRhdGVkKSAmIGlzLm5hKExhdF91cGRhdGVkKSksDQogICAgICAgICAgaGVyZSgib3V0cHV0IiwgImNzdiIsImlzc3VlMi5jc3YiKSkNCmBgYA0KDQpCdXQgUmVzdXJ2ZXkgcGxvdCBhbmQgY29vcmRpbmF0ZXMgYXJlIG5ldmVyIG1pc3NpbmcgYXQgdGhlIHNhbWUgdGltZS4NCg0KYGBge3J9DQpucm93KGRiX3Jlc3VydiU+JQ0KICAgICAgIGZpbHRlcihpcy5uYShgUmVTdXJ2ZXkgcGxvdGApICYgaXMubmEoTG9uX3VwZGF0ZWQpICYgaXMubmEoTGF0X3VwZGF0ZWQpKSkNCmBgYA0KDQojIElTU1VFIDM6IERpZmZlcmVudCBSZVN1cnZleSBvYnNlcnZhdGlvbnMgd2l0aGluIHRoZSBzYW1lIHBsb3QgaGF2ZSBkaWZmZXJlbnQgY29vcmRpbmF0ZXMNCg0KQ2FyZWZ1bCEgSW4gc29tZSBjYXNlcyBkaWZmZXJlbnQgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIHdpdGhpbiB0aGUgc2FtZSBwbG90IGhhdmUgZGlmZmVyZW50IGNvb3JkaW5hdGVzLiANCg0KQ3JlYXRlIHR3byBuZXcgY29sdW1ucyBpbiBkYl9yZXN1cnY6IGNvb3JkaW5hdGVzX2VxdWFsIGluZGljYXRpbmcgaWYgY29vcmRpbmF0ZXMgYXJlIGV4YWN0bHkgZXF1YWwgYmV0d2VlbiBSZVN1cnZleSBvYnNlcnZhdGlvbnMsIGFuZCBjb29yZGluYXRlc19jb25zaXN0ZW50LCBpbmRpY2F0aW5nIGlmIGNvb3JkaW5hdGVzIGFyZSBjb25zaXN0ZW50IGJldHdlZW4gUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIChjb25zaXN0ZW50IG1lYW5pbmcgdGhhdCBkaWZmZXJlbmNlIDwgMC4wMDEgZGVncmVlcykuDQoNCmBgYHtyfQ0KIyBEZWZpbmUgYSB0aHJlc2hvbGQgKGUuZy4sIDAuMDAxIGRlZ3JlZXMgZm9yIGxvbmdpdHVkZS9sYXRpdHVkZSBkaWZmZXJlbmNlcykNCnRocmVzaG9sZCA8LSAwLjAwMQ0KDQpkYl9yZXN1cnYgPC0gZGJfcmVzdXJ2ICU+JQ0KICBncm91cF9ieShSU19DT0RFLCBgUmVTdXJ2ZXkgc2l0ZWAsIGBSZVN1cnZleSBwbG90YCkgJT4lDQogIG11dGF0ZSgNCiAgICBsb25fcmFuZ2UgPSBpZmVsc2UoYWxsKGlzLm5hKExvbl91cGRhdGVkKSksIE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4KExvbl91cGRhdGVkLCBuYS5ybSA9IFQpIC0gDQogICAgICAgICAgICAgICAgICAgICAgICAgbWluKExvbl91cGRhdGVkLCBuYS5ybSA9IFQpKSwNCiAgICBsYXRfcmFuZ2UgPSBpZmVsc2UoYWxsKGlzLm5hKExhdF91cGRhdGVkKSksIE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4KExhdF91cGRhdGVkLCBuYS5ybSA9IFQpIC0gDQogICAgICAgICAgICAgICAgICAgICAgICAgbWluKExhdF91cGRhdGVkLCBuYS5ybSA9IFQpKSwNCiAgICBjb29yZGluYXRlc19lcXVhbCA9IGlmZWxzZShpcy5uYShMb25fdXBkYXRlZCkgJiBpcy5uYShMYXRfdXBkYXRlZCksIE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbl9yYW5nZSA9PSAwICYgbGF0X3JhbmdlID09IDApLA0KICAgIGNvb3JkaW5hdGVzX2NvbnNpc3RlbnQgPSBpZmVsc2UoaXMubmEoTG9uX3VwZGF0ZWQpICYgaXMubmEoTGF0X3VwZGF0ZWQpLCBOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbl9yYW5nZSA8IHRocmVzaG9sZCAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRfcmFuZ2UgPCB0aHJlc2hvbGQpDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KC1sb25fcmFuZ2UsIC1sYXRfcmFuZ2UpDQpgYGANCg0KYGBge3J9DQp3cml0ZV9jc3YoZGJfcmVzdXJ2ICU+JSBmaWx0ZXIoY29vcmRpbmF0ZXNfZXF1YWw9PUZBTFNFKSwNCiAgICAgICAgICBoZXJlKCJvdXRwdXQiLCAiY3N2IiwiaXNzdWUzLmNzdiIpKQ0KYGBgDQoNCmBgYHtyfQ0KZGJfcmVzdXJ2ICU+JSANCiAgZ3JvdXBfYnkoUlNfQ09ERSxgUmVTdXJ2ZXkgc2l0ZWAsIGBSZVN1cnZleSBwbG90YCkgJT4lDQogIHN1bW1hcml6ZShpc19lcXVhbCA9IGFsbChjb29yZGluYXRlc19lcXVhbCksDQogICAgICAgICAgICBpc19jb25zaXN0ZW50ID0gYWxsKGNvb3JkaW5hdGVzX2NvbnNpc3RlbnQpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIG11dGF0ZShjb29yZGluYXRlX3N0YXR1cyA9IGNhc2Vfd2hlbigNCiAgICBpc19lcXVhbCB+ICJFcXVhbCIsDQogICAgIWlzX2VxdWFsICYgaXNfY29uc2lzdGVudCB+ICJDb25zaXN0ZW50ICg8IDAuMDAxwropIiwNCiAgICAhaXNfZXF1YWwgJiAhaXNfY29uc2lzdGVudCB+ICJJbmNvbnNpc3RlbnQgKD4gMC4wMDHCuikiKSkgJT4lDQogIGNvdW50KGNvb3JkaW5hdGVfc3RhdHVzKSU+JQ0KICBtdXRhdGUocGVyY2VudGFnZSA9IG4gLyBzdW0obikgKiAxMDApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBwZXJjZW50YWdlLCB5ID0gY29vcmRpbmF0ZV9zdGF0dXMsIGZpbGwgPSBjb29yZGluYXRlX3N0YXR1cykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQocGVyY2VudGFnZSwgMSksICIlIikpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIHNpemUgPSAzKSArIA0KICBsYWJzKHggPSAiUGVyY2VudGFnZSBvZiBQbG90cyIsIHkgPSBOVUxMKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsNCiAgY29vcmRfZmxpcCgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KZ2dzYXZlKGZpbGVuYW1lPWhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwiaXNzdWUzLnRpZmYiKSwNCiAgICAgICB3aWR0aD0xMCxoZWlnaHQ9Nyx1bml0cz0iY20iLGRwaT0zMDApDQpgYGANCg0KIyBJU1NVRSA0OiBTb21lIHBsb3RzIGhhdmUgb25seSBvbmUgcmVzdXJ2ZXkNCg0KV2hlbiBSZVN1cnZleSBwbG90IGlzIG5vdCBOQSwgdXNlIHRoZSB1bmlxdWUgY29tYmluYXRpb24gb2YgUlNfQ09ERSwgUmVTdXJ2ZXkgc2l0ZSBhbmQgUmVTdXJ2ZXkgcGxvdCB0byB1bmlxdWVseSBkZWZpbmUgZWFjaCBSZVN1cnZleSBwbG90IChhcyBkZWZpbmVkIGluIG1ldGFkYXRhKS4gV2hlbiBSZVN1cnZleSBwbG90IGlzIE5BICgxMTEgcm93cyksIHVzZSB0aGUgdW5pcXVlIGNvbWJpbmF0aW9uIG9mIFJTX0NPREUsIFJlU3VydmV5IHNpdGUgYW5kIHVwZGF0ZWQgY29vcmRpbmF0ZXMgdG8gdW5pcXVlbHkgZGVmaW5lIGVhY2ggUmVTdXJ2ZXkgcGxvdC4gQ2hlY2sgaG93IG1hbnkgcmVzdXJ2ZXlzIChpLmUuIGRpZmZlcmVudCB5ZWFycyBhcmUgdGhlcmUgZm9yIGVhY2ggdW5pcXVlIGNvbWJpbmF0aW9uKS4NCg0KYGBge3J9DQpjb3VudF9yZXN1cnZleXMgPC0gZGJfcmVzdXJ2ICU+JQ0KICAjIENvbnZlcnQgZGF0ZXMgdG8gZGF0ZSBmb3JtYXQgYW5kIGdldCB0aGUgeWVhcg0KICBtdXRhdGUoZGF0ZSA9IGRteShgRGF0ZSBvZiByZWNvcmRpbmdgKSwgeWVhciA9IHllYXIoZGF0ZSkpICU+JQ0KICBncm91cF9ieShSU19DT0RFLCBgUmVTdXJ2ZXkgc2l0ZWAsDQogICAgICAgICAgICMgSWYgUmVTdXJ2ZXkgcGxvdCBpcyBub3QgTkEsIA0KICAgICAgICAgICAjIGdyb3VwIGJ5IFJTX0NPREUsIGBSZVN1cnZleSBzaXRlYCwgYFJlU3VydmV5IHBsb3RgDQogICAgICAgICAgIGBSZVN1cnZleSBwbG90YCA9IGlmZWxzZShpcy5uYShgUmVTdXJ2ZXkgcGxvdGApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BX2NoYXJhY3Rlcl8sIGBSZVN1cnZleSBwbG90YCksDQogICAgICAgICAgICMgSWYgUmVTdXJ2ZXkgcGxvdCBpcyBOQSwgZ3JvdXAgYnkgY29vcmRpbmF0ZXMNCiAgICAgICAgICAgTG9uX3VwZGF0ZWQgPSBpZmVsc2UoaXMubmEoYFJlU3VydmV5IHBsb3RgKSwgTG9uX3VwZGF0ZWQsIE5BX3JlYWxfKSwNCiAgICAgICAgICAgTGF0X3VwZGF0ZWQgPSBpZmVsc2UoaXMubmEoYFJlU3VydmV5IHBsb3RgKSAsIExhdF91cGRhdGVkLCBOQV9yZWFsXykNCiAgKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgR2V0IGhvdyBtYW55IGRpZmZlcmVudCB5ZWFycyBmb3IgZWFjaCB1bmlxdWUgZ3JvdXANCiAgICBkaXN0aW5jdF95ZWFycz1uX2Rpc3RpbmN0KHllYXIpLCANCiAgICAjIEdldCBob3cgbWFueSBkaWZmZXJlbnQgZGF0ZXMgZm9yIGVhY2ggdW5pcXVlIGdyb3VwDQogICAgZGlzdGluY3RfZGF0ZXM9bl9kaXN0aW5jdChkYXRlKSwgLmdyb3VwcyA9ICJkcm9wIikNCmBgYA0KDQpTdW1tYXJ5IHN0YXRzOg0KDQpgYGB7cn0NCnN1bW1hcnkoY291bnRfcmVzdXJ2ZXlzJGRpc3RpbmN0X3llYXJzKQ0Kc2QoY291bnRfcmVzdXJ2ZXlzJGRpc3RpbmN0X3llYXJzKQ0KYGBgDQoNCkhpc3RvZ3JhbXM6DQoNCmBgYHtyfQ0KIyBGb3IgYWxsIGRhdGENCmdncGxvdChjb3VudF9yZXN1cnZleXMsIGFlcyh4ID0gZGlzdGluY3RfeWVhcnMpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBiaW5zID0gNTUpKw0KICB4bGFiKCJOdW1iZXIgb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIChkaWZmZXJlbnQgeWVhcnMpIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgcGxvdHMiKQ0KZ2dzYXZlKGZpbGVuYW1lPWhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwiaXNzdWU0LnRpZmYiKSwNCiAgICAgICB3aWR0aD0xMSxoZWlnaHQ9Nyx1bml0cz0iY20iLGRwaT0zMDApDQpgYGANCg0KTnVtYmVyIGFuZCBwcm9wb3J0aW9uIG9mIHBsb3RzIHdpdGggb25seSAxIHJlc3VydmV5IChzaG91bGQgbm90IGJlIHNvISkNCg0KYGBge3J9DQpucm93KGNvdW50X3Jlc3VydmV5cyU+JWZpbHRlcihkaXN0aW5jdF95ZWFycz09MSkpDQpucm93KGNvdW50X3Jlc3VydmV5cyU+JWZpbHRlcihkaXN0aW5jdF95ZWFycz09MSkpL25yb3coY291bnRfcmVzdXJ2ZXlzKQ0KYGBgDQoNCmBgYHtyfQ0Kd3JpdGVfY3N2KGNvdW50X3Jlc3VydmV5cyU+JWZpbHRlcihkaXN0aW5jdF95ZWFycz09MSksDQogICAgICAgICAgaGVyZSgib3V0cHV0IiwgImNzdiIsImlzc3VlNC5jc3YiKSkNCmBgYA0KDQojIElTU1VFIDU6IERhdGFzZXRzIHdpdGggb25seSBwcmVzZW5jZS9hYnNlbmNlDQoNCmBgYHtyfQ0KZGJfcmVzdXJ2ICU+JQ0KICBmaWx0ZXIoYENvdmVyIGFidW5kYW5jZSBzY2FsZWA9PSJQcmVzZW5jZS9BYnNlbmNlIikgJT4lDQogIGRpc3RpbmN0KERhdGFzZXQpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoZGJfcmVzdXJ2ICU+JSANCiAgICAgICAgIG11dGF0ZShwcmVzX29yX2FiID1pZmVsc2UoYENvdmVyIGFidW5kYW5jZSBzY2FsZWA9PSJQcmVzZW5jZS9BYnNlbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZXNlbmNlL0Fic2VuY2UiLCAiQWJ1bmRhbmNlIiksDQogICAgICAgICAgICAgICAgREtfTmF0dXJkYXRhX1JlcyA9IGlmZWxzZShEYXRhc2V0ID09ICJES19OYXR1cmRhdGFfUmVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZIiwgIk4iKSksDQogICAgICAgICAgICAgICAgYWVzKHByZXNfb3JfYWIsIGZpbGwgPSBES19OYXR1cmRhdGFfUmVzKSkgKw0KICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgKw0KICBsYWJzKHkgPSAiUGVyY2VudGFnZSIsIHggPSBOVUxMKQ0KZ2dzYXZlKGZpbGVuYW1lPWhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwiaXNzdWU1LnRpZmYiKSwNCiAgICAgICB3aWR0aD0xMixoZWlnaHQ9Nyx1bml0cz0iY20iLGRwaT0zMDApDQpgYGANCg0KDQpGb3IgREtfTmF0dXJkYXRhX1JlcyAtIGluZm8gYWJvdXQgaGFiaXRhdCBmcm9tIEplcmtlcidzIGZpbGUgKHNlZSBiZWxvdykuDQoNCiMgSVNTVUUgNjogT2JzZXJ2YXRpb25zIHdpdGggd3JvbmcgY291bnRyeSAoR0lTKQ0KDQpSZWFkIHRleHQgZmlsZSB3cm9uZ19jb3VudHJpZXMgb2J0YWluZWQgaW4gQXJjR0lTOg0KDQpgYGB7cn0NCndyb25nX2NvdW50cmllcyA8LSByZWFkX2RlbGltKGhlcmUoImRhdGEiLCAiY2xlYW4iLCJ3cm9uZ19jb3VudHJpZXMudHh0IiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbSA9ICI7IikNCmBgYA0KDQpgYGB7cn0NCndyaXRlX2Nzdih3cm9uZ19jb3VudHJpZXMsIGhlcmUoIm91dHB1dCIsICJjc3YiLCJpc3N1ZTYuY3N2IikpDQpgYGANCg0KIyBJU1NVRSA3OiBEaWZmZXJlbnQgY292ZXIgYWJ1bmRhbmNlIHNjYWxlcw0KDQpgYGB7cn0NCmdncGxvdChkYl9yZXN1cnYsIGFlcyhgQ292ZXIgYWJ1bmRhbmNlIHNjYWxlYCkpICsNCiAgICAgICAgIGdlb21fYmFyKGFlcyh5ID0gKC4uY291bnQuLikgLyBzdW0oLi5jb3VudC4uKSAqIDEwMCkpICsNCiAgbGFicyh5ID0gIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIiwgeCA9ICJDb3ZlciBhYnVuZGFuY2Ugc2NhbGUiKSArDQogIGNvb3JkX2ZsaXAoKQ0KZ2dzYXZlKGZpbGVuYW1lPWhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwiaXNzdWU3LnRpZmYiKSwNCiAgICAgICB3aWR0aD0xOCxoZWlnaHQ9MTAsdW5pdHM9ImNtIixkcGk9MzAwKQ0KYGBgDQoNCiMgSVNTVUUgODogV3JvbmcgRVVOSVMgY29kZXMNCg0KVXNlZCB0aGlzIGluZm8gaW4gbWV0YWRhdGEgZmlsZToNCg0KRXhwZXJ0IHN5c3RlbSBjbGFzc2lmaWNhdGlvbiB0byBFVU5JUyBoYWJpdGF0cyAoaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvNDgxMjczNiA7IGh0dHBzOi8vZmxvcmF2ZWcuZXUvaGFiaXRhdC8pLiANCkkgYW0gc2VuZGluZyB5b3UgbGVnZW5kIGZvciBFVU5JUyBjbGFzc2lmaWNhdGlvbiB2ZXJzaW9uIDIwMjItMTAtMTYgd2l0aCBhbGwgY29kZXMgYW5kIG1lYW5pbmdzLCBkaXJlY3RseSBwcmVwYXJlZCBmcm9tIGV4cGVydCBzeXN0ZW0gZmlsZSAoc2Vjb25kIHNoZWV0KSAtIGl0IGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHB1Ymxpc2hlZCB2ZXJzaW9uIGluIFpFTk9ETyAoaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvNDgxMjczNiAsIGxpdHRsZSBiaXQgb2xkIGRhdGVkIG5vdykgYW5kIGZyb20gaHR0cHM6Ly9mbG9yYXZlZy5ldS9oYWJpdGF0LyAobGl0dGxlIGJpdCBuZXdlciB0aGFuIGluIGN1cnJlbnQgRVZBIHZlcnNpb24pLg0KDQpRYSA9IG1pcmVzIGFuZCBRYiA9IHdldGxhbmRzDQpQIHVuaXRzIOKAkyBpbiBmbG9yYXZlZy5ldSB0aGVyZSBpcyBzbGlnaHRseSBkaWZmZXJlbnQgY2xhc3NpZmljYXRpb24gKGh0dHBzOi8vZmxvcmF2ZWcuZXUvaGFiaXRhdC9vdmVydmlldy9QKSwgYnV0IGluIEVWQSBpcyBzdGlsbCB0aGlzIGNsYXNzaWZpY2F0aW9uIG9mIFA6DQoNClAgU3VyZmFjZSB3YXRlcnMNClBhIEJhc2UtcG9vciBzcHJpbmcgYW5kIHNwcmluZyBicm9vaw0KUGIgQ2FsY2FyZW91cyBzcHJpbmcgYW5kIHNwcmluZyBicm9vaw0KUGMgQnJhY2tpc2gtd2F0ZXIgdmVnZXRhdGlvbg0KUGQgRnJlc2gtd2F0ZXIgc21hbGwgcGxldXN0b3BoeXRlIHZlZ2V0YXRpb24NClBlIEZyZXNoLXdhdGVyIGxhcmdlIHBsZXVzdG9waHl0ZSB2ZWdldGF0aW9uDQpQZiBGcmVzaC13YXRlciBzdWJtZXJnZWQgdmVnZXRhdGlvbg0KUGcgRnJlc2gtd2F0ZXIgbnltcGhhZWlkIHZlZ2V0YXRpb24NClBoIE9saWdvdHJvcGhpYy13YXRlciB2ZWdldGF0aW9uDQpQaSBEeXN0cm9waGljLXdhdGVyIHZlZ2V0YXRpb24NClBqIFN0b25ld29ydCB2ZWdldGF0aW9uIA0KDQpQcmVzZW5jZSBvZiDigJwh4oCdIHNpbXBseSBtZWFucyB0aGF0IGZvciBvbmUgdW5pdCB0aGVyZSBhcmUgdHdvIG9yIG1vcmUgZGlmZmVyZW50IGZvcm11bGFzLCBlLmcuIFIxMSBhbmQgUjExIS4gU28gaXQgaXMgb25seSB0ZWNobmljYWwgc3R1ZmYuDQoNCk11bHRpcGxlIGFzc2lnbm1lbnQgb2YgcmVsZXbDqSDigJMgbm8gcHJpb3JpdHksIGFscGhhYmV0aWNhbCBvcmRlciwgZS5nLiBOMTYhLFM2NixTODEgbWVhbnMgdGhhdCByZWxldsOpIGNhbiBiZSBhc3NpZ25lZCB0byBhbGwgMyB1bml0czogTjE2IE1lZGl0ZXJyYW5lYW4gYW5kIE1hY2Fyb25lc2lhbiBjb2FzdGFsIGR1bmUgZ3Jhc3NsYW5kIChncmV5IGR1bmUpLCBTNjYgTWVkaXRlcnJhbmVhbiBoYWxvLW5pdHJvcGhpbG91cyBzY3J1YiBhbmQgUzgxIENhbmFyaWFuIHhlcm9waHl0aWMgc2NydWINCg0KTm8gdmFsdWUgcHJlc2VudCBpbiBFeHBlcnQgU3lzdGVtIOKAkyByZWxldsOpIGRpZG7CtHQgZW50ZXIgZXhwZXJ0IHN5c3RlbSBjbGFzc2lmaWNhdGlvbiAoPSBpdCBtZWFucyB0aGF0IHNvbWUgcHJlcmVxdWlzaXRlcyBhcmUgbWlzc2luZykNCg0K4oCcfuKAnSDigJMgcmVsZXbDqSBlbnRlcmVkIGV4cGVydCBjbGFzc2lmaWNhdGlvbiBob3dldmVyIHdhcyBub3QgY2xhc3NpZmllZCB0byBhbnkgRVVOSVMgdW5pdA0KKw0KDQpDbGVhbiBpbmZvIG9uIEV4cGVydCBzeXN0ZW0gY29sdW1uIGFuZCBzZXBhcmF0ZSBpdCB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIGNvZGVzLg0KDQpgYGB7cn0NCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogIG11dGF0ZSgNCiAgICAjIENsZWFuICdFeHBlcnQgU3lzdGVtJyBjb2x1bW4gYnkgcmVtb3ZpbmcgIiEiIGFuZCByZXBsYWNpbmcgIn4iIHdpdGggTkENCiAgICBgRXhwZXJ0IFN5c3RlbWAgPSBjYXNlX3doZW4oDQogICAgICBgRXhwZXJ0IFN5c3RlbWAgPT0gIn4iIH4gTkFfY2hhcmFjdGVyXywgICMgUmVwbGFjZSAifiIgd2l0aCBOQQ0KICAgICAgVFJVRSB+IHN0cl9yZXBsYWNlX2FsbChgRXhwZXJ0IFN5c3RlbWAsICIhIiwgIiIpICAjIFJlbW92ZSAiISINCiAgICApDQogICkgJT4lDQogICMgU2VwYXJhdGUgdGhlIHZhbHVlcyBpbiAnRXhwZXJ0IFN5c3RlbScgaW50byBtdWx0aXBsZSBjb2x1bW5zDQogIHNlcGFyYXRlKA0KICAgIGBFeHBlcnQgU3lzdGVtYCwNCiAgICBpbnRvID0gYygiRVVOSVNhIiwgIkVVTklTYiIsICJFVU5JU2MiLCAiRVVOSVNkIiksDQogICAgc2VwID0gIiwiLA0KICAgIGV4dHJhID0gImRyb3AiLCAgIyBEcm9wIGV4dHJhIHZhbHVlcyBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIGNvbHVtbnMNCiAgICBmaWxsID0gInJpZ2h0IiwgICAjIEZpbGwgbWlzc2luZyB2YWx1ZXMgd2l0aCBOQSBmb3IgY2FzZXMgd2l0aCBmZXdlciB2YWx1ZXMNCiAgICByZW1vdmUgPSBGQUxTRSAgICAjIEtlZXAgdGhlIG9yaWdpbmFsICdFeHBlcnQgU3lzdGVtJyBjb2x1bW4NCiAgKQ0KYGBgDQoNCkNhbGN1bGF0ZSBob3cgbWFueSBkaWZmZXJlbnQgRVVOSVMgY29kZXMgaGF2ZSBiZWVuIGFzc2lnbmVkOg0KDQpgYGB7cn0NCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvdW50IHRoZSBudW1iZXIgb2Ygbm9uLU5BIHZhbHVlcyBhY3Jvc3MgdGhlIEVVTklTIGNvbHVtbnMNCiAgICBuX0VVTklTID0gcm93U3VtcyghaXMubmEoc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJFVU5JUyIpKSkpDQogICkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkYl9yZXN1cnYsIGFlcyhuX0VVTklTKSkgKw0KICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgKw0KICBsYWJzKHkgPSAiUGVyY2VudGFnZSBvZiBSZVN1cnZleSBvYnNlcnZhdGlvbnMiLA0KICAgICAgIHggPSAiTnVtYmVyIG9mIGRpZmZlcm50IEVVTklTIGNvZGVzIGFzc2lnbmVkIikgKyBjb29yZF9mbGlwKCkNCmdncGxvdChkYl9yZXN1cnYgJT4lIGZpbHRlcihuX0VVTklTID4gMCksIGFlcyhuX0VVTklTKSkgKw0KICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgKw0KICBsYWJzKHkgPSAiUGVyY2VudGFnZSBvZiBSZVN1cnZleSBvYnNlcnZhdGlvbnMiLA0KICAgICAgIHggPSAiTnVtYmVyIG9mIGRpZmZlcm50IEVVTklTIGNvZGVzIGFzc2lnbmVkIikgKyBjb29yZF9mbGlwKCkNCmBgYA0KDQpDb3JyZWN0IHNvbWUgRVVOSVMgY29kZXMgdGhhdCBhcmUgcHJvYmFibHkgd3Jvbmc6DQoNCmBgYHtyfQ0KZGJfcmVzdXJ2IDwtIGRiX3Jlc3VydiAlPiUNCiAgbXV0YXRlKGFjcm9zcyhzdGFydHNfd2l0aCgiRVVOSVMiKSwgfiBjYXNlX3doZW4oDQogICAgLiA9PSAiTjE2TSIgfiAiTjE2IiwNCiAgICAuID09ICJTYSIgfiAiVjQiLA0KICAgIC4gPT0gIlNiIiB+ICJWNSIsDQogICAgLiA9PSAiVDFDVCIgfiAiVDFDIiwNCiAgICAuID09ICJOMTVBIiB+ICJOMTUiLA0KICAgIFRSVUUgfiAuDQogICkpKQ0KYGBgDQoNCkFkZCBjb2x1bW5zIGZvciB0aGUgZGlmZmVyZW50IEVVTklTIGxldmVsczoNCg0KYGBge3J9DQpkYl9yZXN1cnYgPC0gZGJfcmVzdXJ2ICU+JQ0KICBtdXRhdGUoDQogICAgIyBFVU5JU2EgbGV2ZWxzDQogICAgRVVOSVNhXzEgPSBzdWJzdHIoRVVOSVNhLCAxLCBpZmVsc2Uoc3RyX3N0YXJ0cyhFVU5JU2EsICJNQSIpLCAyLCAxKSksDQogICAgRVVOSVNhXzIgPSBpZmVsc2UoDQogICAgICBuY2hhcihFVU5JU2EpID49IGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYSwgIk1BIiksIDMsIDIpLCANCiAgICAgIHN1YnN0cihFVU5JU2EsIDEsIGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYSwgIk1BIiksIDMsIDIpKSwNCiAgICAgIE5BX2NoYXJhY3Rlcl8NCiAgICApLA0KICAgIEVVTklTYV8zID0gaWZlbHNlKA0KICAgICAgbmNoYXIoRVVOSVNhKSA+PSBpZmVsc2Uoc3RyX3N0YXJ0cyhFVU5JU2EsICJNQSIpLCA0LCAzKSwgDQogICAgICBzdWJzdHIoRVVOSVNhLCAxLCBpZmVsc2Uoc3RyX3N0YXJ0cyhFVU5JU2EsICJNQSIpLCA0LCAzKSksDQogICAgICBOQV9jaGFyYWN0ZXJfDQogICAgICApLA0KICAgIEVVTklTYV80ID0gaWZlbHNlKA0KICAgICAgbmNoYXIoRVVOSVNhKSA+PSBpZmVsc2Uoc3RyX3N0YXJ0cyhFVU5JU2EsICJNQSIpLCA1LCA0KSwgDQogICAgICBzdWJzdHIoRVVOSVNhLCAxLCBpZmVsc2Uoc3RyX3N0YXJ0cyhFVU5JU2EsICJNQSIpLCA1LCA0KSksDQogICAgICBOQV9jaGFyYWN0ZXJfDQogICAgKSwNCiAgICANCiAgICAjIEVVTklTYiBsZXZlbHMNCiAgICBFVU5JU2JfMSA9IHN1YnN0cihFVU5JU2IsIDEsIGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYiwgIk1BIiksIDIsIDEpKSwNCiAgICBFVU5JU2JfMiA9IGlmZWxzZSgNCiAgICAgIG5jaGFyKEVVTklTYikgPj0gaWZlbHNlKHN0cl9zdGFydHMoRVVOSVNiLCAiTUEiKSwgMywgMiksIA0KICAgICAgc3Vic3RyKEVVTklTYiwgMSwgaWZlbHNlKHN0cl9zdGFydHMoRVVOSVNiLCAiTUEiKSwgMywgMikpLA0KICAgICAgTkFfY2hhcmFjdGVyXw0KICAgICksDQogICAgRVVOSVNiXzMgPSBpZmVsc2UoDQogICAgICBuY2hhcihFVU5JU2IpID49IGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYiwgIk1BIiksIDQsIDMpLCANCiAgICAgIHN1YnN0cihFVU5JU2IsIDEsIGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYiwgIk1BIiksIDQsIDMpKSwNCiAgICAgIE5BX2NoYXJhY3Rlcl8NCiAgICApLA0KICAgIEVVTklTYl80ID0gaWZlbHNlKA0KICAgICAgbmNoYXIoRVVOSVNiKSA+PSBpZmVsc2Uoc3RyX3N0YXJ0cyhFVU5JU2IsICJNQSIpLCA1LCA0KSwgDQogICAgICBzdWJzdHIoRVVOSVNiLCAxLCBpZmVsc2Uoc3RyX3N0YXJ0cyhFVU5JU2IsICJNQSIpLCA1LCA0KSksDQogICAgICBOQV9jaGFyYWN0ZXJfDQogICAgKSwNCiAgICANCiAgICAjIEVVTklTYyBsZXZlbHMNCiAgICBFVU5JU2NfMSA9IHN1YnN0cihFVU5JU2MsIDEsIGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYywgIk1BIiksIDIsIDEpKSwNCiAgICBFVU5JU2NfMiA9IGlmZWxzZSgNCiAgICAgIG5jaGFyKEVVTklTYykgPj0gaWZlbHNlKHN0cl9zdGFydHMoRVVOSVNjLCAiTUEiKSwgMywgMiksIA0KICAgICAgc3Vic3RyKEVVTklTYywgMSwgaWZlbHNlKHN0cl9zdGFydHMoRVVOSVNjLCAiTUEiKSwgMywgMikpLA0KICAgICAgTkFfY2hhcmFjdGVyXw0KICAgICksDQogICAgRVVOSVNjXzMgPSBpZmVsc2UoDQogICAgICBuY2hhcihFVU5JU2MpID49IGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYywgIk1BIiksIDQsIDMpLCANCiAgICAgIHN1YnN0cihFVU5JU2MsIDEsIGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYywgIk1BIiksIDQsIDMpKSwNCiAgICAgIE5BX2NoYXJhY3Rlcl8NCiAgICApLA0KICAgIEVVTklTY180ID0gaWZlbHNlKA0KICAgICAgbmNoYXIoRVVOSVNjKSA+PSBpZmVsc2Uoc3RyX3N0YXJ0cyhFVU5JU2MsICJNQSIpLCA1LCA0KSwgDQogICAgICBzdWJzdHIoRVVOSVNjLCAxLCBpZmVsc2Uoc3RyX3N0YXJ0cyhFVU5JU2MsICJNQSIpLCA1LCA0KSksDQogICAgICBOQV9jaGFyYWN0ZXJfDQogICAgKSwNCiAgICANCiAgICAjIEVVTklTZCBsZXZlbHMNCiAgICBFVU5JU2RfMSA9IHN1YnN0cihFVU5JU2QsIDEsIGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYywgIk1BIiksIDIsIDEpKSwNCiAgICBFVU5JU2RfMiA9IGlmZWxzZSgNCiAgICAgIG5jaGFyKEVVTklTZCkgPj0gaWZlbHNlKHN0cl9zdGFydHMoRVVOSVNkLCAiTUEiKSwgMywgMiksIA0KICAgICAgc3Vic3RyKEVVTklTZCwgMSwgaWZlbHNlKHN0cl9zdGFydHMoRVVOSVNkLCAiTUEiKSwgMywgMikpLA0KICAgICAgTkFfY2hhcmFjdGVyXw0KICAgICksDQogICAgRVVOSVNkXzMgPSBpZmVsc2UoDQogICAgICBuY2hhcihFVU5JU2QpID49IGlmZWxzZShzdHJfc3RhcnRzKEVVTklTZCwgIk1BIiksIDQsIDMpLCANCiAgICAgIHN1YnN0cihFVU5JU2QsIDEsIGlmZWxzZShzdHJfc3RhcnRzKEVVTklTZCwgIk1BIiksIDQsIDMpKSwNCiAgICAgIE5BX2NoYXJhY3Rlcl8NCiAgICApLA0KICAgIEVVTklTZF80ID0gaWZlbHNlKA0KICAgICAgbmNoYXIoRVVOSVNkKSA+PSBpZmVsc2Uoc3RyX3N0YXJ0cyhFVU5JU2QsICJNQSIpLCA1LCA0KSwgDQogICAgICBzdWJzdHIoRVVOSVNkLCAxLCBpZmVsc2Uoc3RyX3N0YXJ0cyhFVU5JU2QsICJNQSIpLCA1LCA0KSksDQogICAgICBOQV9jaGFyYWN0ZXJfDQogICAgKQ0KICApDQpgYGANCg0KQ3JlYXRlIG5ldyBjb2x1bW5zIHdpdGggZGVzY3JpcHRpb25zIGZvciB0aGUgbGV2ZWwgMSBjb2RlczoNCg0KYGBge3J9DQpkYl9yZXN1cnYgPC0gZGJfcmVzdXJ2ICU+JQ0KICBtdXRhdGUoDQogICAgRVVOSVNhXzFfZGVzY3IgPSBjYXNlX3doZW4oDQogICAgICBFVU5JU2FfMSA9PSAiViIgfiAiVmVnZXRhdGVkIG1hbi1tYWRlIGhhYml0YXRzIiwNCiAgICAgIEVVTklTYV8xID09ICJVIiB+ICJJbmxhbmQgaGFiaXRhdHMgd2l0aCBubyBvciBsaXR0bGUgc29pbCIsDQogICAgICBFVU5JU2FfMSA9PSAiVCIgfiAiRm9yZXN0cyBhbmQgb3RoZXIgd29vZGVkIGxhbmQiLA0KICAgICAgRVVOSVNhXzEgPT0gIlMiIH4gIkhlYXRobGFuZHMsIHNjcnViIGFuZCB0dW5kcmEiLA0KICAgICAgRVVOSVNhXzEgPT0gIlIiIH4gIkdyYXNzbGFuZHMiLA0KICAgICAgRVVOSVNhXzEgPT0gIlEiIH4gIldldGxhbmRzIiwNCiAgICAgIEVVTklTYV8xID09ICJQIiB+ICJJbmxhbmQgd2F0ZXJzIiwNCiAgICAgIEVVTklTYV8xID09ICJOIiB+ICJDb2FzdGFsIGhhYml0YXRzIiwNCiAgICAgIEVVTklTYV8xID09ICJNQSIgfiAiTWFyaW5lIGhhYml0YXRzIiwNCiAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfDQogICAgKSwNCiAgICBFVU5JU2JfMV9kZXNjciA9IGNhc2Vfd2hlbigNCiAgICAgIEVVTklTYl8xID09ICJWIiB+ICJWZWdldGF0ZWQgbWFuLW1hZGUgaGFiaXRhdHMiLA0KICAgICAgRVVOSVNiXzEgPT0gIlUiIH4gIklubGFuZCBoYWJpdGF0cyB3aXRoIG5vIG9yIGxpdHRsZSBzb2lsIiwNCiAgICAgIEVVTklTYl8xID09ICJUIiB+ICJGb3Jlc3RzIGFuZCBvdGhlciB3b29kZWQgbGFuZCIsDQogICAgICBFVU5JU2JfMSA9PSAiUyIgfiAiSGVhdGhsYW5kcywgc2NydWIgYW5kIHR1bmRyYSIsDQogICAgICBFVU5JU2JfMSA9PSAiUiIgfiAiR3Jhc3NsYW5kcyIsDQogICAgICBFVU5JU2JfMSA9PSAiUSIgfiAiV2V0bGFuZHMiLA0KICAgICAgRVVOSVNiXzEgPT0gIlAiIH4gIklubGFuZCB3YXRlcnMiLA0KICAgICAgRVVOSVNiXzEgPT0gIk4iIH4gIkNvYXN0YWwgaGFiaXRhdHMiLA0KICAgICAgRVVOSVNiXzEgPT0gIk1BIiB+ICJNYXJpbmUgaGFiaXRhdHMiLA0KICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8NCiAgICApLA0KICAgIEVVTklTY18xX2Rlc2NyID0gY2FzZV93aGVuKA0KICAgICAgRVVOSVNjXzEgPT0gIlYiIH4gIlZlZ2V0YXRlZCBtYW4tbWFkZSBoYWJpdGF0cyIsDQogICAgICBFVU5JU2NfMSA9PSAiVSIgfiAiSW5sYW5kIGhhYml0YXRzIHdpdGggbm8gb3IgbGl0dGxlIHNvaWwiLA0KICAgICAgRVVOSVNjXzEgPT0gIlQiIH4gIkZvcmVzdHMgYW5kIG90aGVyIHdvb2RlZCBsYW5kIiwNCiAgICAgIEVVTklTY18xID09ICJTIiB+ICJIZWF0aGxhbmRzLCBzY3J1YiBhbmQgdHVuZHJhIiwNCiAgICAgIEVVTklTY18xID09ICJSIiB+ICJHcmFzc2xhbmRzIiwNCiAgICAgIEVVTklTY18xID09ICJRIiB+ICJXZXRsYW5kcyIsDQogICAgICBFVU5JU2NfMSA9PSAiUCIgfiAiSW5sYW5kIHdhdGVycyIsDQogICAgICBFVU5JU2NfMSA9PSAiTiIgfiAiQ29hc3RhbCBoYWJpdGF0cyIsDQogICAgICBFVU5JU2NfMSA9PSAiTUEiIH4gIk1hcmluZSBoYWJpdGF0cyIsDQogICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXw0KICAgICksDQogICAgRVVOSVNkXzFfZGVzY3IgPSBjYXNlX3doZW4oDQogICAgICBFVU5JU2RfMSA9PSAiViIgfiAiVmVnZXRhdGVkIG1hbi1tYWRlIGhhYml0YXRzIiwNCiAgICAgIEVVTklTZF8xID09ICJVIiB+ICJJbmxhbmQgaGFiaXRhdHMgd2l0aCBubyBvciBsaXR0bGUgc29pbCIsDQogICAgICBFVU5JU2RfMSA9PSAiVCIgfiAiRm9yZXN0cyBhbmQgb3RoZXIgd29vZGVkIGxhbmQiLA0KICAgICAgRVVOSVNkXzEgPT0gIlMiIH4gIkhlYXRobGFuZHMsIHNjcnViIGFuZCB0dW5kcmEiLA0KICAgICAgRVVOSVNkXzEgPT0gIlIiIH4gIkdyYXNzbGFuZHMiLA0KICAgICAgRVVOSVNkXzEgPT0gIlEiIH4gIldldGxhbmRzIiwNCiAgICAgIEVVTklTZF8xID09ICJQIiB+ICJJbmxhbmQgd2F0ZXJzIiwNCiAgICAgIEVVTklTZF8xID09ICJOIiB+ICJDb2FzdGFsIGhhYml0YXRzIiwNCiAgICAgIEVVTklTZF8xID09ICJNQSIgfiAiTWFyaW5lIGhhYml0YXRzIiwNCiAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfDQogICAgKQ0KICApDQpgYGANCg0KUGxvdCBmb3IgRVVOSVNhXzEgKHRoZSBmaXJzdCBhc3NpZ25lZCBFVU5JUyBpbiBjYXNlcyBvZiBtdWx0aXBsZSBhc3NpZ25hdGlvbnMsIGxldmVsIDEpOg0KDQpgYGB7cn0NCmdncGxvdChkYl9yZXN1cnYsIGFlcyhFVU5JU2FfMV9kZXNjcikpICsNCiAgICAgICAgIGdlb21fYmFyKGFlcyh5ID0gKC4uY291bnQuLikgLyBzdW0oLi5jb3VudC4uKSAqIDEwMCkpICsNCiAgbGFicyh5ID0gIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIiwNCiAgICAgICB4ID0gIkVVTklTIGxldmVsIDEiKSArIGNvb3JkX2ZsaXAoKQ0KZ2dwbG90KGRiX3Jlc3VydiAlPiUgZmlsdGVyKCFpcy5uYShFVU5JU2FfMV9kZXNjcikpLCBhZXMoRVVOSVNhXzFfZGVzY3IpKSArDQogICAgICAgICBnZW9tX2JhcihhZXMoeSA9ICguLmNvdW50Li4pIC8gc3VtKC4uY291bnQuLikgKiAxMDApKSArDQogIGxhYnMoeSA9ICJQZXJjZW50YWdlIG9mIFJlU3VydmV5IG9ic2VydmF0aW9ucyIsDQogICAgICAgeCA9ICJFVU5JUyBsZXZlbCAxIikgKyBjb29yZF9mbGlwKCkNCmdnc2F2ZShmaWxlbmFtZT1oZXJlKCJvdXRwdXQiLCAiZmlndXJlcyIsImlzc3VlOC50aWZmIiksDQogICAgICAgd2lkdGg9MTgsaGVpZ2h0PTEwLHVuaXRzPSJjbSIsZHBpPTMwMCkNCmBgYA0KDQojIElTU1VFIDk6IE1hbmlwdWxhdGVkIHBsb3RzIGFuZCBpbmZvIG9uIG1hbmlwdWxhdGlvbiB0eXBlDQoNCmBgYHtyfQ0KZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBNYW5pcHVsYXRlICh5L24pYCkpICsNCiAgICAgICAgIGdlb21fYmFyKGFlcyh5ID0gKC4uY291bnQuLikgLyBzdW0oLi5jb3VudC4uKSAqIDEwMCkpICsNCiAgbGFicyh5ID0gIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIiwNCiAgICAgICB4ID0gIk1hbmlwdWxhdGlvbiIpDQpnZ3NhdmUoZmlsZW5hbWU9aGVyZSgib3V0cHV0IiwgImZpZ3VyZXMiLCJpc3N1ZTkudGlmZiIpLA0KICAgICAgIHdpZHRoPTEwLGhlaWdodD04LHVuaXRzPSJjbSIsZHBpPTMwMCkNCmBgYA0KDQpMaXN0IG9mIFR5cGUgb2YgTWFuaXB1bGF0aW9uIGluIG1hbmlwdWxhdGVkIHBsb3RzIChtaXhlZCBpbmZvcm1hdGlvbik6DQoNCmBgYHtyfQ0Kd3JpdGVfY3N2KGRhdGEuZnJhbWUodW5pcXVlKGRiX3Jlc3VydiRgVHlwZSBvZiBtYW5pcHVsYXRpb25gKSksDQogICAgICAgICAgaGVyZSgib3V0cHV0IiwgImNzdiIsImlzc3VlOS5jc3YiKSkNCmBgYA0KDQojIElTU1VFIDEwOiBMb2NhdGlvbiBtZXRob2QNCg0KYGBge3J9DQpnZ3Bsb3QoZGJfcmVzdXJ2LCBhZXMoYExvY2F0aW9uIG1ldGhvZGApKSArDQogICAgICAgICBnZW9tX2JhcihhZXMoeSA9ICguLmNvdW50Li4pIC8gc3VtKC4uY291bnQuLikgKiAxMDApKSArDQogIGxhYnMoeSA9ICJQZXJjZW50YWdlIG9mIFJlU3VydmV5IG9ic2VydmF0aW9ucyIsDQogICAgICAgeCA9ICJMb2NhdGlvbiBtZXRob2QiKSArIGNvb3JkX2ZsaXAoKQ0KZ2dzYXZlKGZpbGVuYW1lPWhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwiaXNzdWUxMC50aWZmIiksDQogICAgICAgd2lkdGg9MTgsaGVpZ2h0PTgsdW5pdHM9ImNtIixkcGk9MzAwKQ0KYGBgDQoNCiMgSVNTVUUgMTE6IFJlc3VydmV5IHByb2plY3QgdHlwZXMNCg0KYGBge3J9DQp1bmlxdWUoZGJfcmVzdXJ2JFJTX1BST0pUWVApDQpgYGANCg0KVW5pZnkgY29kZXM6DQoNCmBgYHtyfQ0KZGJfcmVzdXJ2IDwtIGRiX3Jlc3VydiAlPiUNCiAgbXV0YXRlKFJTX1BST0pUWVAgPSByZWNvZGUoUlNfUFJPSlRZUCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc2FtcGxpbmciID0gInJlc2FtcGxpbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVybWFuZW50IChtYW4pIiA9ICJwZXJtYW5lbnQgKG1hbikiKSkNCmBgYA0KDQpgYGB7cn0NCnVuaXF1ZShkYl9yZXN1cnYkUlNfUFJPSlRZUCkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkYl9yZXN1cnYsIGFlcyhSU19QUk9KVFlQLCBmaWxsPWBNYW5pcHVsYXRlICh5L24pYCkpICsNCiAgICAgICAgIGdlb21fYmFyKGFlcyh5ID0gKC4uY291bnQuLikgLyBzdW0oLi5jb3VudC4uKSAqIDEwMCkpICsNCiAgbGFicyh5ID0gIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIiwNCiAgICAgICB4ID0gIlJlc3VydmV5IHByb2plY3QgdHlwZSIpICsgY29vcmRfZmxpcCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpDQpnZ3NhdmUoZmlsZW5hbWU9aGVyZSgib3V0cHV0IiwgImZpZ3VyZXMiLCJpc3N1ZTExLnRpZmYiKSwNCiAgICAgICB3aWR0aD0xOCxoZWlnaHQ9OCx1bml0cz0iY20iLGRwaT0zMDApDQpgYGANCg0KIyBJU1NVRSAxMjogQ29sdW1uIFJTX0RVUEwNCg0KYGBge3J9DQpkYl9yZXN1cnYgJT4lIGZpbHRlcighaXMubmEoUlNfRFVQTCkpICU+JSBzZWxlY3QoUlNfQ09ERSwgUlNfRFVQTCkgJT4lDQogIGRpc3RpbmN0KCkNCmBgYA0KDQojIElTU1VFIDEzOiBMb2NhdGlvbiB1bmNlcnRhaW50eQ0KDQpgYGB7cn0NCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogICMgUmVkZWZpbmUgcHJlY2lzaW9uX25ldywgd2hpY2ggd2FzIHdyb25nDQogIG11dGF0ZShwcmVjaXNpb25fbmV3ID0gZmFjdG9yKGlmZWxzZShpcy5uYShMb25fcHJlYykgJiBpcy5uYShMYXRfcHJlYyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxKSkpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoZGJfcmVzdXJ2LCBhZXMoYExvY2F0aW9uIHVuY2VydGFpbnR5IChtKWAsIGZpbGwgPSBwcmVjaXNpb25fbmV3KSkgKw0KICBnZW9tX2hpc3RvZ3JhbSggY29sb3IgPSAiYmxhY2siKSArDQogIHhsYWIoIkxvY2F0aW9uIHVuY2VydGFpbnR5IChtKSIpDQpnZ3Bsb3QoZGJfcmVzdXJ2ICU+JSBmaWx0ZXIoYExvY2F0aW9uIHVuY2VydGFpbnR5IChtKWAgPD0gNTAwKSwNCiAgICAgICBhZXMoYExvY2F0aW9uIHVuY2VydGFpbnR5IChtKWAsIGZpbGwgPSBwcmVjaXNpb25fbmV3KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShjb2xvciA9ICJibGFjayIpICsNCiAgeGxhYigiTG9jYXRpb24gdW5jZXJ0YWludHkgKG0pIDw9IDUwMCIpDQpnZ3NhdmUoZmlsZW5hbWU9aGVyZSgib3V0cHV0IiwgImZpZ3VyZXMiLCJpc3N1ZTEzXzEudGlmZiIpLA0KICAgICAgIHdpZHRoPTE4LGhlaWdodD04LHVuaXRzPSJjbSIsZHBpPTMwMCkNCmdncGxvdChkYl9yZXN1cnYgJT4lIGZpbHRlcihgTG9jYXRpb24gdW5jZXJ0YWludHkgKG0pYCA+IDUwMCksDQogICAgICAgYWVzKGBMb2NhdGlvbiB1bmNlcnRhaW50eSAobSlgLCBmaWxsID0gcHJlY2lzaW9uX25ldykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3IgPSAiYmxhY2siKSArDQogIHhsYWIoIkxvY2F0aW9uIHVuY2VydGFpbnR5IChtKSA+IDUwMCIpDQpnZ3NhdmUoZmlsZW5hbWU9aGVyZSgib3V0cHV0IiwgImZpZ3VyZXMiLCJpc3N1ZTEzXzIudGlmZiIpLA0KICAgICAgIHdpZHRoPTE4LGhlaWdodD04LHVuaXRzPSJjbSIsZHBpPTMwMCkNCmBgYA0KDQoNCiMgTk8gSVNTVUVTIEZST00gSEVSRQ0KDQojIEFsdGl0dWRlIGFuZCBzbG9wZSB2YWx1ZXMNCg0KVW5pcXVlIHNsb3BlIHZhbHVlczoNCg0KYGBge3J9DQp1bmlxdWUoKGRiX3Jlc3VydikkYFNsb3BlICjCsClgKSAlPiUgc3RyX3NvcnQoKQ0KYGBgDQoNClNldCBhbHRpdHVkZSwgc2xvcGUgYW5kIGFzcGVjdCBhcyBudW1lcmljOg0KDQpgYGB7cn0NCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogIG11dGF0ZSgNCiAgICAjIFNvbWUgYWx0aXR1ZGUgdmFsdWVzIGhhdmUgYSAiLSIgYWZ0ZXIgdGhlIG51bWJlciwNCiAgICAjIGNvbnZlcnQgdG8gbnVtZXJpYyBhZnRlciByZW1vdmluZyB0aGF0DQogICAgQWx0aXR1ZGUgPSBhcy5udW1lcmljKGdzdWIoIi0iLCAiIiwgQWx0aXR1ZGUpKSwNCiAgICAjIFNvbWUgc2xvcGUgdmFsdWVzIGFyZSBub3RlZCBhcyAiXyIgb3IgIi0iLCB0aGVzZSBzaG91bGQgYmUgTkEsDQogICAgIyBvdGhlcndpc2UgY29udmVydCB0byBudW1lcmljDQogICAgYFNsb3BlICjCsClgID0gaWZlbHNlKGBTbG9wZSAowrApYCA9PSAiXyIgfCBgU2xvcGUgKMKwKWAgPT0gIi0iLA0KICAgICAgICAgICAgICAgICAgIE5BLCBhcy5udW1lcmljKGBTbG9wZSAowrApYCkpLA0KICAgICMgQ29udmVydCBhc3BlY3QgdmFsdWVzIHRvIG51bWVyaWMNCiAgICBgQXNwZWN0ICjCsClgID0gYXMubnVtZXJpYyhgQXNwZWN0ICjCsClgKQ0KICAgICkNCmBgYA0KDQpIaXN0b2dyYW1zOg0KDQpgYGB7cn0NCmdncGxvdChkYl9yZXN1cnYsIGFlcyhBbHRpdHVkZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIikNCmdncGxvdChkYl9yZXN1cnYsIGFlcyhgQXNwZWN0ICjCsClgKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siKQ0KZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBTbG9wZSAowrApYCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIikNCmdnc2F2ZShmaWxlbmFtZT1oZXJlKCJvdXRwdXQiLCAiZmlndXJlcyIsImlzc3VlOC50aWZmIiksDQogICAgICAgd2lkdGg9MTgsaGVpZ2h0PTEwLHVuaXRzPSJjbSIsZHBpPTMwMCkNCmBgYA0KDQpgYGB7cn0NCnJhbmdlKGRiX3Jlc3VydiRgU2xvcGUgKMKwKWAsIG5hLnJtPVQpDQpgYGANCg0KIyBBZGQgY29sdW1ucyBkYXRlIGFuZCB5ZWFyDQoNCmBgYHtyfQ0KZGJfcmVzdXJ2IDwtIGRiX3Jlc3VydiAlPiUNCiAgbXV0YXRlKGRhdGUgPSBkbXkoYERhdGUgb2YgcmVjb3JkaW5nYCksIHllYXIgPSB5ZWFyKGRhdGUpKQ0KYGBgDQoNCkhpc3RvZ3JhbXM6DQoNCmBgYHtyfQ0KZ2dwbG90KGRiX3Jlc3VydiwgYWVzKHllYXIpKSArIGdlb21faGlzdG9ncmFtKGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KIyBQbG90IHNpemUNCg0KYGBge3J9DQpnZ3Bsb3QoZGJfcmVzdXJ2LCBhZXMoYFJlbGV2w6kgYXJlYSAobcKyKWApKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KT2JzZXJ2YXRpb25zIHdpdGggbm8gaW5mbyBvbiBwbG90IHNpemU6DQoNCmBgYHtyfQ0KbnJvdyhkYl9yZXN1cnYgJT4lIGZpbHRlcihpcy5uYShgUmVsZXbDqSBhcmVhIChtwrIpYCkpKQ0KYGBgDQoNCiMgQ292ZXIgdmFsdWVzICh0b3RhbCwgdHJlZXMsIHNocnVicywgaGVyYnMsIG1vc3Nlc3MpDQoNCmBgYHtyfQ0KZGJfcmVzdXJ2ICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYENvdmVyIHRvdGFsICglKWAsIGBDb3ZlciB0cmVlIGxheWVyICglKWAsDQogICAgICAgICAgICAgICAgICAgICAgICBgQ292ZXIgc2hydWIgbGF5ZXIgKCUpYCwgYENvdmVyIGhlcmIgbGF5ZXIgKCUpYCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGBDb3ZlciBtb3NzIGxheWVyICglKWApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIsIGJpbnMgPSAxMCkgKw0KICBmYWNldF93cmFwKH4gdmFyaWFibGUsIHNjYWxlcyA9ICJmcmVlIikgKw0KICBsYWJzKHggPSAiVmFsdWUiLCB5ID0gIkZyZXF1ZW5jeSIpDQpgYGANCg0KYGBge3J9DQpkYl9yZXN1cnYgJT4lDQogIHJlZnJhbWUoYWNyb3NzKGMoYENvdmVyIHRvdGFsICglKWAsIGBDb3ZlciB0cmVlIGxheWVyICglKWAsDQogICAgICAgICAgICAgICAgICAgICBgQ292ZXIgc2hydWIgbGF5ZXIgKCUpYCwgYENvdmVyIGhlcmIgbGF5ZXIgKCUpYCwNCiAgICAgICAgICAgICAgICAgICAgIGBDb3ZlciBtb3NzIGxheWVyICglKWApLCB+cmFuZ2UoLiwgbmEucm0gPSBUUlVFKSkpDQpgYGANCg0KQWxsIHZhbHVlcyBPSy4NCg0KIyBNb3NzZXMgYW5kIGxpY2hlbnMgaWRlbnRpZmllZA0KDQpgYGB7cn0NCmdncGxvdChkYl9yZXN1cnYsIGFlcyhgTW9zc2VzIGlkZW50aWZpZWQgKFkvTilgKSkgKyBnZW9tX2JhcigpDQpnZ3Bsb3QoZGJfcmVzdXJ2LCBhZXMoYExpY2hlbnMgaWRlbnRpZmllZCAoWS9OKWApKSArIGdlb21fYmFyKCkNCmBgYA0KDQpOQSBpbiBtb3N0IGNhc2VzLg0KDQojIEFsbCByZXN1cnZleXMgZm9yIGVhY2ggcmVzdXJ2ZXkgcGxvdCB0byBzZW5kIHRvIEJlYQ0KDQpgYGB7cn0NCmRiX0V1cm9wYTwtIGRiX3Jlc3VydiAlPiUNCiAgZ3JvdXBfYnkoUlNfQ09ERSwgYFJlU3VydmV5IHNpdGVgLA0KICAgICAgICAgICAjIElmIFJlU3VydmV5IHBsb3QgaXMgbm90IE5BLCANCiAgICAgICAgICAgIyBncm91cCBieSBSU19DT0RFLCBgUmVTdXJ2ZXkgc2l0ZWAsIGBSZVN1cnZleSBwbG90YA0KICAgICAgICAgICBgUmVTdXJ2ZXkgcGxvdGAgPSBpZmVsc2UoaXMubmEoYFJlU3VydmV5IHBsb3RgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQV9jaGFyYWN0ZXJfLCBgUmVTdXJ2ZXkgcGxvdGApLA0KICAgICAgICAgICAjIElmIFJlU3VydmV5IHBsb3QgaXMgTkEsIGdyb3VwIGJ5IGNvb3JkaW5hdGVzDQogICAgICAgICAgICMgQ3JlYXRlIGEgdW5pcXVlIGdyb3VwaW5nIHZhcmlhYmxlIHRoYXQgdXNlcyBjb29yZGluYXRlcw0KICAgICAgICAgICAjIG9ubHkgd2hlbiBjb25kaXRpb25zIGFyZSBtZXQNCiAgICAgICAgICAgZ3JvdXBfY29vcmRzID0gaWZlbHNlKGlzLm5hKGBSZVN1cnZleSBwbG90YCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZShMb25fdXBkYXRlZCwgTGF0X3VwZGF0ZWQpLCBOQV9jaGFyYWN0ZXJfKQ0KICApICU+JQ0KICAjIEFkZCB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIGVhY2ggcGxvdC4NCiAgIyBUaGVzZSBhcmUgYmFzZWQgb24gdGhlIHVuaXF1ZSBjb21iaW5hdGlvbiBvZiBSU19DT0RFLCBSZVN1cnZleSBzaXRlIGFuZCANCiAgIyBSZVN1cnZleSBwbG90IChXaGVuIFJlU3VydmV5IHBsb3QgaXMgbm90IE5BKQ0KICAjIGFuZCBvbiB0aGUgdW5pcXVlIGNvbWJpbmF0aW9uIG9mIFJTX0NPREUsIFJlU3VydmV5IHNpdGUgDQogICMgYW5kIHVwZGF0ZWQgY29vcmRpbmF0ZXMgKFdoZW4gUmVTdXJ2ZXkgcGxvdCBpcyBOQSkNCiAgbXV0YXRlKHBsb3RfdW5pcXVlX2lkID0gY3VyX2dyb3VwX2lkKCkpICU+JQ0KICBzZWxlY3QoUGxvdE9ic2VydmF0aW9uSUQsIENvdW50cnksIGBEYXRlIG9mIHJlY29yZGluZ2AsIFJTX0NPREUsDQogICAgICAgICBgUmVTdXJ2ZXkgc2l0ZWAsIGBSZVN1cnZleSBwbG90YCwgTG9uX3VwZGF0ZWQsIExhdF91cGRhdGVkLA0KICAgICAgICAgZ3JvdXBfY29vcmRzLCBgRXhwZXJ0IFN5c3RlbWAsIGBMb2NhdGlvbiBtZXRob2RgLCBwbG90X3VuaXF1ZV9pZCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgIyBDb252ZXJ0IGRhdGVzIHRvIGRhdGUgZm9ybWF0IGFuZCBnZXQgdGhlIHllYXINCiAgbXV0YXRlKGRhdGUgPSBkbXkoYERhdGUgb2YgcmVjb3JkaW5nYCksIHllYXIgPSB5ZWFyKGRhdGUpKSAlPiUNCiAgc2VsZWN0KC1gRGF0ZSBvZiByZWNvcmRpbmdgLCAtZGF0ZSwgLWdyb3VwX2Nvb3JkcykgJT4lDQogICMgQWRkIHVuaXF1ZSBpZGVudGlmaWVycyBmb3IgZWFjaCBvYnNlcnZhdGlvbg0KICBtdXRhdGUob2JzX3VuaXF1ZV9pZCA9IHJvd19udW1iZXIoKSkNCmBgYA0KDQpgYGB7cn0NCnByaW50KGRiX0V1cm9wYSwgd2lkdGggPSBJbmYpDQpgYGANCg0KU2F2ZSB0byBjc3YgKGZpbGUgZm9yIHVzKToNCg0KYGBge3J9DQp3cml0ZV9jc3YoZGJfRXVyb3BhLGhlcmUoImRhdGEiLCAiY2xlYW4iLCJkYl9FdXJvcGFfMjAyNTAxMDcuY3N2IikpDQpgYGANCg0KU2F2ZSB0byBjc3YgKGZpbGUgZm9yIEJlYSwgd2l0aCBvbmx5IGVzc2VudGlhbCBpbmZvKToNCg0KYGBge3J9DQp3cml0ZV9jc3YoZGJfRXVyb3BhICU+JSANCiAgICAgICAgICAgIHNlbGVjdChvYnNfdW5pcXVlX2lkLCBwbG90X3VuaXF1ZV9pZCwgTG9uX3VwZGF0ZWQsIExhdF91cGRhdGVkLA0KICAgICAgICAgICAgICAgICAgIHllYXIpLA0KICAgICAgICAgIGhlcmUoImRhdGEiLCAiY2xlYW4iLCJkYl9FdXJvcGFfMjAyNDEyMTBfc2hvcnQuY3N2IikpDQpgYGANCg0KIyBJbmZvIG9uIEhhYml0YXRJRCBmcm9tIERLIA0KDQpCYXNlZCBvbiBpbmZvcm1hdGlvbiBnb3QgZnJvbSBKZXNwZXIuDQoNCiMjIFJlYWQgdGhlIGRhdGEgc2VudCBieSBKZXNwZXIgZnJvbSBESw0KDQpgYGB7cn0NCmRiX0RLX0o8LXJlYWRfdHN2KGhlcmUoImRhdGEiLCAicmF3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIkRLX05hdHVyZGF0YV9SZXNfaGFiaXRhdF9oYWJfY29kZXNfSmVzcGVyIiwNCiAgICAgICAgICAgICAgICAgICJES19OYXR1cmRhdGFfUmVzX2hhYml0YXRfaGFiX2NvZGVzLnR4dCIpKQ0KYGBgDQoNCiMjIEFkZCBpbmZvIG9uIEhhYml0YXRJRCB0byBkYl9yZXN1cnYNCg0KYGBge3J9DQpkYl9yZXN1cnYgPC0gZGJfcmVzdXJ2ICU+JQ0KICAjIEtlZXBpbmcgYWxsIG9icyBpbiBkYl9yZXN1cnYgYnV0IG5vdCBhbGwgaW4gZGJfREtfSg0KICBsZWZ0X2pvaW4oZGJfREtfSiAlPiUgc2VsZWN0KFBsb3RPYnNlcnZhdGlvbklELCBIYWJpdGF0SUQpKQ0KYGBgDQoNCiMjIExpc3Qgb2YgSGFiaXRhdElEDQoNCmBgYHtyfQ0KcHJpbnQoZGJfcmVzdXJ2ICU+JSBkaXN0aW5jdChIYWJpdGF0SUQpLCBuID0gMTAwKQ0KYGBgDQoNCldyaXRlIGNzdjoNCg0KYGBge3J9DQp3cml0ZV9jc3YoZGJfcmVzdXJ2ICU+JSBkaXN0aW5jdChIYWJpdGF0SUQpLA0KICAgICAgICAgIGhlcmUoImRhdGEiLCAiY2xlYW4iLCJsaXN0X0hhYml0YXRJRF9ESy5jc3YiKSkNCmBgYA0KDQojIyBDYXNlcyB3aXRob3V0IEhhYml0YXRJRCBpbmZvDQoNCkNhc2VzIHdpdGhvdXQgRVN5IEVVTklTIGhhYml0YXQ6DQoNCmBgYHtyfQ0KbnJvdyhkYl9yZXN1cnYgJT4lIGZpbHRlcihpcy5uYShgRXhwZXJ0IFN5c3RlbWApKSkvbnJvdyhkYl9yZXN1cnYpDQpgYGANCg0KQ2FzZXMgd2l0aG91dCBFU3kgRVVOSVMgaGFiaXRhdCBidXQgd2l0aCBIYWJpdGF0SUQgZnJvbSBESzoNCg0KYGBge3J9DQpucm93KGRiX3Jlc3VydiAlPiUgZmlsdGVyKGlzLm5hKGBFeHBlcnQgU3lzdGVtYCkmIWlzLm5hKEhhYml0YXRJRCkpKS9ucm93KGRiX3Jlc3VydikNCmBgYA0KDQpDYXNlcyB3aXRob3V0IEVTeSBFVU5JUyBoYWJpdGF0IGFuZCB3aXRob3V0IEhBQklUQVQgZnJvbSBESzoNCg0KYGBge3J9DQpucm93KGRiX3Jlc3VydiAlPiUgDQogICAgICAgZmlsdGVyKGlzLm5hKGBFeHBlcnQgU3lzdGVtYCkmaXMubmEoSGFiaXRhdElEKSkpL25yb3coZGJfcmVzdXJ2KQ0KYGBgDQoNCkNhc2VzIHdpdGhvdXQgRVN5IEVVTklTIGhhYml0YXQgYW5kIHdpdGhvdXQgSGFiaXRhdElEIGZyb20gREsgd2hlcmUgZGF0YSBpcyBwcmVzZW5jZSAvIGFic2VuY2U6DQoNCmBgYHtyfQ0KbnJvdyhkYl9yZXN1cnYgJT4lDQogICAgICAgZmlsdGVyKGlzLm5hKGBFeHBlcnQgU3lzdGVtYCkgJg0KICAgICAgICAgICAgICAgIGlzLm5hKEhhYml0YXRJRCkgJg0KICAgICAgICAgICAgICAgIGBDb3ZlciBhYnVuZGFuY2Ugc2NhbGVgID09ICJQcmVzZW5jZS9BYnNlbmNlIikpLw0KICBucm93KGRiX3Jlc3VydikNCmBgYA0KDQpDYXNlcyB3aXRob3V0IEVTeSBFVU5JUyBoYWJpdGF0IGFuZCB3aXRob3V0IEhhYml0YXRJRCBmcm9tIERLIHdoZXJlIGRhdGEgaXMgbm90IHByZXNlbmNlIC8gYWJzZW5jZToNCg0KYGBge3J9DQpucm93KGRiX3Jlc3VydiAlPiUNCiAgICAgICBmaWx0ZXIoaXMubmEoYEV4cGVydCBTeXN0ZW1gKSAmDQogICAgICAgICAgICAgICAgaXMubmEoSGFiaXRhdElEKSAmDQogICAgICAgICAgICAgICAgYENvdmVyIGFidW5kYW5jZSBzY2FsZWAgIT0gIlByZXNlbmNlL0Fic2VuY2UiKSkvDQogIG5yb3coZGJfcmVzdXJ2KQ0KYGBgDQoNCiMjIENoYW5nZSBzb21lIEFubmV4IEkgaGFiaXRhdCBjb2RlcyB0aGF0IHdlcmUgd3JvbmcNCg0KYGBge3J9DQpkYl9yZXN1cnYgPC0gZGJfcmVzdXJ2ICU+JQ0KICBtdXRhdGUoSGFiaXRhdElEID0gYXMuY2hhcmFjdGVyKEhhYml0YXRJRCkpICU+JQ0KICBtdXRhdGUoSGFiaXRhdElEID0gaWZlbHNlKEhhYml0YXRJRCA9PSAiOTk5OCIsICI5MUQwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoSGFiaXRhdElEID09ICI5OTk5IiwgIjkxRTAiLCBIYWJpdGF0SUQpKSkNCmBgYA0KDQojIEFkZCBpbmZvIG9uIGNvcnJlc3BvbmRlbmNlcyBIYWJpdGF0SUQgKERLLCBKZXNwZXIpIC0gRVVOSVMNCg0KUmVhZCBjb3JyZXNwb25kZW5jZXMgZmlsZToNCg0KYGBge3J9DQpjb3JyZXNwb25kZW5jZXM8LXJlYWRfZXhjZWwoaGVyZSgiZGF0YSIsICJlZGl0ZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlc3BvbmRlbmNlX0hhYml0YXRJRF9ESy54bHN4IikpDQpgYGANCg0KQWRkIGluZm8gdG8gZGJfcmVzdXJ2Og0KDQpgYGB7cn0NCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogICMgS2VlcGluZyBhbGwgb2JzIGluIGRiX3Jlc3VydiBidXQgbm90IGFsbCBpbiBkYl9ES19KDQogIGxlZnRfam9pbihjb3JyZXNwb25kZW5jZXMgJT4lIHNlbGVjdChIYWJpdGF0SUQsIEVVTklTKSkNCmBgYA0KDQpDb3JyZWN0IE5BIHZhbHVlcyBpbiBFVU5JUw0KDQpgYGB7cn0NCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogIG11dGF0ZShFVU5JUyA9IGlmZWxzZShFVU5JUyA9PSAiTkEiLCBOQSwgRVVOSVMpKQ0KYGBgDQoNCkFkZCBpbmZvIG9uIEVVTklTIChESykgdG8gRVVOSVNhOg0KDQpgYGB7cn0NCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogIG11dGF0ZShFVU5JU2EgPQ0KICAgICAgICAgICAjIElmIEVVTklTIChESykgaXMgYXZhaWxhYmxlLCBhZGQgYXMgRVVOSVNhDQogICAgICAgICAgIGlmZWxzZSghaXMubmEoRVVOSVMpLCBFVU5JUywgDQogICAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSBrZWVwIEVVTklTYQ0KICAgICAgICAgICAgICAgICAgRVVOSVNhKSwNCiAgICAgICAgIEVVTklTX2Fzc2lnbmF0aW9uID0gaWZlbHNlKCFpcy5uYShFVU5JUyksICJJbmZvIGZyb20gREsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGlzLm5hKEVVTklTYSksICJOb3QgcG9zc2libGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlcnQgc3lzdGVtIikpKSAlPiUNCiAgIyBSZW1vdmUgY29sdW1uIEVVTklTIChESykNCiAgc2VsZWN0KC1FVU5JUykNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkYl9yZXN1cnYsIGFlcyhFVU5JU19hc3NpZ25hdGlvbikpICsNCiAgICAgICAgIGdlb21fYmFyKGFlcyh5ID0gKC4uY291bnQuLikgLyBzdW0oLi5jb3VudC4uKSAqIDEwMCkpICsNCiAgbGFicyh5ID0gIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIiwNCiAgICAgICB4ID0gIkVVTklTIGFzc2lnbmF0aW9uIikNCmBgYA0KDQojIyBHZW5lcmF0ZSBmaWxlIGZvciBJU1NVRSA1DQoNCmBgYHtyfQ0Kd3JpdGVfY3N2KGRiX3Jlc3VydiAlPiUNCiAgICAgICAgICAgIGZpbHRlcihpcy5uYShgRXhwZXJ0IFN5c3RlbWApJmlzLm5hKEhhYml0YXRJRCkpLA0KICAgICAgICAgIGhlcmUoIm91dHB1dCIsICJjc3YiLCJpc3N1ZTUuY3N2IikpDQpgYGANCg0KIyMgVXBkYXRlIGNvbHVtbnMgZm9yIEVVTklTIGxldmVscyBhbmQgZGVzY3JpcHRpb25zDQoNClVwZGF0ZSB0aGUgY29sdW1ucyBmb3IgdGhlIGRpZmZlcmVudCBFVU5JU3MgbGV2ZWxzOg0KDQpgYGB7cn0NCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogIG11dGF0ZSgNCiAgICAjIEVVTklTYSBsZXZlbHMNCiAgICBFVU5JU2FfMSA9IHN1YnN0cihFVU5JU2EsIDEsIGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYSwgIk1BIiksIDIsIDEpKSwNCiAgICBFVU5JU2FfMiA9IGlmZWxzZSgNCiAgICAgIG5jaGFyKEVVTklTYSkgPj0gaWZlbHNlKHN0cl9zdGFydHMoRVVOSVNhLCAiTUEiKSwgMywgMiksIA0KICAgICAgc3Vic3RyKEVVTklTYSwgMSwgaWZlbHNlKHN0cl9zdGFydHMoRVVOSVNhLCAiTUEiKSwgMywgMikpLA0KICAgICAgTkFfY2hhcmFjdGVyXw0KICAgICksDQogICAgRVVOSVNhXzMgPSBpZmVsc2UoDQogICAgICBuY2hhcihFVU5JU2EpID49IGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYSwgIk1BIiksIDQsIDMpLCANCiAgICAgIHN1YnN0cihFVU5JU2EsIDEsIGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYSwgIk1BIiksIDQsIDMpKSwNCiAgICAgIE5BX2NoYXJhY3Rlcl8NCiAgICAgICksDQogICAgRVVOSVNhXzQgPSBpZmVsc2UoDQogICAgICBuY2hhcihFVU5JU2EpID49IGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYSwgIk1BIiksIDUsIDQpLCANCiAgICAgIHN1YnN0cihFVU5JU2EsIDEsIGlmZWxzZShzdHJfc3RhcnRzKEVVTklTYSwgIk1BIiksIDUsIDQpKSwNCiAgICAgIE5BX2NoYXJhY3Rlcl8NCiAgICApDQogICkgJT4lDQogICMgUmVtb3ZlIEhhYml0YXRJRCBjb2x1bW4NCiAgc2VsZWN0KC1IYWJpdGF0SUQpDQpgYGANCg0KVXBkYXRlIGNvbHVtbnMgd2l0aCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBsZXZlbCAxIGNvZGVzOg0KDQpgYGB7cn0NCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogIG11dGF0ZSgNCiAgICBFVU5JU2FfMV9kZXNjciA9IGNhc2Vfd2hlbigNCiAgICAgIEVVTklTYV8xID09ICJWIiB+ICJWZWdldGF0ZWQgbWFuLW1hZGUgaGFiaXRhdHMiLA0KICAgICAgRVVOSVNhXzEgPT0gIlUiIH4gIklubGFuZCBoYWJpdGF0cyB3aXRoIG5vIG9yIGxpdHRsZSBzb2lsIiwNCiAgICAgIEVVTklTYV8xID09ICJUIiB+ICJGb3Jlc3RzIGFuZCBvdGhlciB3b29kZWQgbGFuZCIsDQogICAgICBFVU5JU2FfMSA9PSAiUyIgfiAiSGVhdGhsYW5kcywgc2NydWIgYW5kIHR1bmRyYSIsDQogICAgICBFVU5JU2FfMSA9PSAiUiIgfiAiR3Jhc3NsYW5kcyIsDQogICAgICBFVU5JU2FfMSA9PSAiUSIgfiAiV2V0bGFuZHMiLA0KICAgICAgRVVOSVNhXzEgPT0gIlAiIH4gIklubGFuZCB3YXRlcnMiLA0KICAgICAgRVVOSVNhXzEgPT0gIk4iIH4gIkNvYXN0YWwgaGFiaXRhdHMiLA0KICAgICAgRVVOSVNhXzEgPT0gIk1BIiB+ICJNYXJpbmUgaGFiaXRhdHMiLA0KICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8NCiAgICApDQogICkNCmBgYA0KDQojIyBOdW1iZXIgb2YgZGlmZmVyZW50IEVVTklTIGNvZGVzDQoNClJlY2FsY3VsYXRlIGhvdyBtYW55IGRpZmZlcmVudCBFVU5JUyBjb2RlcyBoYXZlIGJlZW4gYXNzaWduZWQ6DQoNCmBgYHtyfQ0KZGJfcmVzdXJ2IDwtIGRiX3Jlc3VydiAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ291bnQgdGhlIG51bWJlciBvZiBub24tTkEgdmFsdWVzIGFjcm9zcyB0aGUgRVVOSVMgY29sdW1ucw0KICAgIG5fRVVOSVMgPSByb3dTdW1zKCFpcy5uYShzZWxlY3QoLiwgRVVOSVNhOkVVTklTZCkpKQ0KICApDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoZGJfcmVzdXJ2LCBhZXMobl9FVU5JUykpICsNCiAgICAgICAgIGdlb21fYmFyKGFlcyh5ID0gKC4uY291bnQuLikgLyBzdW0oLi5jb3VudC4uKSAqIDEwMCkpICsNCiAgbGFicyh5ID0gIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIiwNCiAgICAgICB4ID0gIk51bWJlciBvZiBkaWZmZXJudCBFVU5JUyBjb2RlcyBhc3NpZ25lZCIpICsgY29vcmRfZmxpcCgpDQpnZ3Bsb3QoZGJfcmVzdXJ2ICU+JSBmaWx0ZXIobl9FVU5JUyA+IDApLCBhZXMobl9FVU5JUykpICsNCiAgICAgICAgIGdlb21fYmFyKGFlcyh5ID0gKC4uY291bnQuLikgLyBzdW0oLi5jb3VudC4uKSAqIDEwMCkpICsNCiAgbGFicyh5ID0gIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIiwNCiAgICAgICB4ID0gIk51bWJlciBvZiBkaWZmZXJudCBFVU5JUyBjb2RlcyBhc3NpZ25lZCIpICsgY29vcmRfZmxpcCgpDQpgYGANCg0KTmV3IHBsb3QgZm9yIEVVTklTYV8xICh0aGUgZmlyc3QgYXNzaWduZWQgRVVOSVMgaW4gY2FzZXMgb2YgbXVsdGlwbGUgYXNzaWduYXRpb25zLCBsZXZlbCAxKToNCg0KYGBge3J9DQpnZ3Bsb3QoZGJfcmVzdXJ2LCBhZXMoRVVOSVNhXzFfZGVzY3IpKSArDQogICAgICAgICBnZW9tX2JhcihhZXMoeSA9ICguLmNvdW50Li4pIC8gc3VtKC4uY291bnQuLikgKiAxMDApKSArDQogIGxhYnMoeSA9ICJQZXJjZW50YWdlIG9mIFJlU3VydmV5IG9ic2VydmF0aW9ucyIsDQogICAgICAgeCA9ICJFVU5JUyBsZXZlbCAxIikgKyBjb29yZF9mbGlwKCkNCmdncGxvdChkYl9yZXN1cnYgJT4lIGZpbHRlcighaXMubmEoRVVOSVNhXzFfZGVzY3IpKSwgYWVzKEVVTklTYV8xX2Rlc2NyKSkgKw0KICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgKw0KICBsYWJzKHkgPSAiUGVyY2VudGFnZSBvZiBSZVN1cnZleSBvYnNlcnZhdGlvbnMiLA0KICAgICAgIHggPSAiRVVOSVMgbGV2ZWwgMSIpICsgY29vcmRfZmxpcCgpDQpgYGANCg0KIyBBZGQgaW5mbyBvbiBkZXNjcmlwdGlvbnMgZm9yIEVVTklTIGxldmVscyAyLTQNCg0KYGBge3J9DQpkZXNjcmlwdGlvbnM8LXJlYWRfZXhjZWwoaGVyZSgiZGF0YSIsICJlZGl0ZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVVTklTLUhhYml0YXRzLTIwMjEtMDYtMDFfbW9kaWZpZWQueGxzeCIpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBEZWZpbmUgdGhlIGNvbHVtbnMgYW5kIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRpb24gY29sdW1uIG5hbWVzDQpldW5pc19jb2xzIDwtIGMoIkVVTklTYV8yIiwgIkVVTklTYV8zIiwgIkVVTklTYV80IiwNCiAgICAgICAgICAgICAgICAiRVVOSVNiXzIiLCAiRVVOSVNiXzMiLCAiRVVOSVNiXzQiLCANCiAgICAgICAgICAgICAgICAiRVVOSVNjXzIiLCAiRVVOSVNjXzMiLCAiRVVOSVNjXzQiLA0KICAgICAgICAgICAgICAgICJFVU5JU2RfMiIsICJFVU5JU2RfMyIsICJFVU5JU2RfNCIpDQoNCiMgQ3JlYXRlIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRpb24gY29sdW1uIG5hbWVzDQpkZXNjcl9jb2xfbmFtZXMgPC0gcGFzdGUwKGV1bmlzX2NvbHMsICJfZGVzY3IiKQ0KDQojIFVzZSByZWR1Y2UgdG8gbG9vcCB0aHJvdWdoIHRoZSBjb2x1bW5zIGFuZCBqb2luIGR5bmFtaWNhbGx5IGJhc2VkIG9uIGxldmVsDQpkYl9yZXN1cnYgPC0gcmVkdWNlKHNlcV9hbG9uZyhldW5pc19jb2xzKSwgZnVuY3Rpb24oZGF0YSwgaSkgew0KICAjIEV4dHJhY3QgbGV2ZWwgbnVtYmVyIGZyb20gdGhlIGNvbHVtbiBuYW1lIChlLmcuLCBFVU5JU2FfMiAtPiAyKQ0KICBsZXZlbCA8LSBhcy5udW1lcmljKGdzdWIoIlxcRCIsICIiLCBldW5pc19jb2xzW2ldKSkNCiAgDQogICMgRmlsdGVyIGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbGV2ZWwNCiAgZGVzY3JpcHRpb25zX2xldmVsIDwtIGRlc2NyaXB0aW9ucyAlPiUNCiAgICBmaWx0ZXIobGV2ZWwgPT0gbGV2ZWwpICU+JQ0KICAgIHNlbGVjdChgRVVOSVMgMjAyMCBjb2RlYCwgYEVVTklTLTIwMjEgaGFiaXRhdCBuYW1lYCkNCiAgDQogICMgUGVyZm9ybSB0aGUgbGVmdF9qb2luIGFuZCByZW5hbWUgdGhlIGNvbHVtbiBkeW5hbWljYWxseQ0KICBkYXRhICU+JQ0KICAgIGxlZnRfam9pbigNCiAgICAgIGRlc2NyaXB0aW9uc19sZXZlbCwNCiAgICAgIGJ5ID0gc2V0TmFtZXMoIkVVTklTIDIwMjAgY29kZSIsIGV1bmlzX2NvbHNbaV0pDQogICAgKSAlPiUNCiAgICByZW5hbWUoISFkZXNjcl9jb2xfbmFtZXNbaV0gOj0gYEVVTklTLTIwMjEgaGFiaXRhdCBuYW1lYCkNCn0sIC5pbml0ID0gZGJfcmVzdXJ2KQ0KYGBgDQoNClRoZSBtYXRjaGluZyBkaWQgbm90IHdvcmsgc29tZXRpbWVzLCBjb3JyZWN0IQ0KDQpgYGB7cn0NCiMgQ29ycmVjdCBFVU5JU2EgbGV2ZWxzIDItNCBkZXNjcmlwdGlvbnMNCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogIG11dGF0ZShFVU5JU2FfMl9kZXNjciA9IA0KICAgICAgICAgICBpZmVsc2UoIWlzLm5hKEVVTklTYV8yX2Rlc2NyKSwgRVVOSVNhXzJfZGVzY3IsDQogICAgICAgICAgICAgICAgICBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgICAgIEVVTklTYV8yID09ICJQZiIgfiAiRnJlc2gtd2F0ZXIgc3VibWVyZ2VkIHZlZ2V0YXRpb24iLA0KICAgICAgICAgICAgICAgICAgICBFVU5JU2FfMiA9PSAiUGoiIH4gIlN0b25ld29ydCB2ZWdldGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgRVVOSVNhXzIgPT0gIlI0IiB+ICJBbHBpbmUgYW5kIHN1YmFscGluZSBncmFzc2xhbmRzIiwNCiAgICAgICAgICAgICAgICAgICAgRVVOSVNhXzIgPT0gIlBiIiB+ICJDYWxjYXJlb3VzIHNwcmluZyBhbmQgc3ByaW5nIGJyb29rIiwNCiAgICAgICAgICAgICAgICAgICAgRVVOSVNhXzIgPT0gIlFiIiB+ICJXZXRsYW5kcyIsDQogICAgICAgICAgICAgICAgICAgIEVVTklTYV8yID09ICJSMyIgfiAiU2Vhc29uYWxseSB3ZXQgYW5kIHdldCBncmFzc2xhbmRzIiwNCiAgICAgICAgICAgICAgICAgICAgRVVOSVNhXzIgPT0gIlFhIiB+ICJNaXJlcyIsDQogICAgICAgICAgICAgICAgICAgIEVVTklTYV8yID09ICJQYSIgfiAiQmFzZS1wb29yIHNwcmluZyBhbmQgc3ByaW5nIGJyb29rIiwNCiAgICAgICAgICAgICAgICAgICAgRVVOSVNhXzIgPT0gIlBoIiB+ICJPbGlnb3Ryb3BoaWMtd2F0ZXIgdmVnZXRhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgIEVVTklTYV8yID09ICJQZyIgfiAiRnJlc2gtd2F0ZXIgbnltcGhhZWlkIHZlZ2V0YXRpb24iLA0KICAgICAgICAgICAgICAgICAgICBFVU5JU2FfMiA9PQ0KICAgICAgICAgICAgICAgICAgICAgICJQZCIgfiAiRnJlc2gtd2F0ZXIgc21hbGwgcGxldXN0b3BoeXRlIHZlZ2V0YXRpb24iLA0KICAgICAgICAgICAgICAgICAgICBFVU5JU2FfMiA9PSAiUGMiIH4gIkJyYWNraXNoLXdhdGVyIHZlZ2V0YXRpb24iLA0KICAgICAgICAgICAgICAgICAgICBFVU5JU2FfMiA9PQ0KICAgICAgICAgICAgICAgICAgICAgICJQZSIgfiAiRnJlc2gtd2F0ZXIgbGFyZ2UgcGxldXN0b3BoeXRlIHZlZ2V0YXRpb24iLA0KICAgICAgICAgICAgICAgICAgICBFVU5JU2FfMiA9PSAiUGkiIH4gIkR5c3Ryb3BoaWMtd2F0ZXIgdmVnZXRhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgIEVVTklTYV8yID09ICJTMSIgfiAiVHVuZHJhIiwNCiAgICAgICAgICAgICAgICAgICAgRVVOSVNhXzIgPT0NCiAgICAgICAgICAgICAgICAgICAgICAiVTciIH4gIlVudmVnZXRhdGVkIG9yIHNwYXJzZWx5IHZlZ2V0YXRlZCBncmF2ZWwgYmFycyIsDQogICAgICAgICAgICAgICAgICAgIEVVTklTYV8yID09ICJRNiIgfiAiUGVyaW9kaWNhbGx5IGV4cG9zZWQgc2hvcmVzIiwNCiAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pDQogICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgRVVOSVNhXzNfZGVzY3IgPSANCiAgICAgICAgICAgaWZlbHNlKCFpcy5uYShFVU5JU2FfM19kZXNjciksIEVVTklTYV8zX2Rlc2NyLA0KICAgICAgICAgICAgICAgICAgY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgICAgICBFVU5JU2FfMyA9PSJVNzEiIH4gIlVudmVnZXRhdGVkIG9yIHNwYXJzZWx5IHZlZ2V0YXRlZCBncmF2ZWwgYmFyIGluIG1vbnRhbmUgYW5kIGFscGluZSByZWdpb25zIiwNCiAgICAgICAgICAgICAgICAgICAgRVVOSVNhXzMgPT0iUTYxIiB+ICJQZXJpb2RpY2FsbHkgZXhwb3NlZCBzaG9yZSB3aXRoIHN0YWJsZSwgZXV0cm9waGljIHNlZGltZW50cyB3aXRoIHBpb25lZXIgb3IgZXBoZW1lcmFsIHZlZ2V0YXRpb24iLA0KICAgICAgICAgICAgICAgICAgICBFVU5JU2FfMyA9PSJRNjIiIH4gIlBlcmlvZGljYWxseSBleHBvc2VkIHNob3JlIHdpdGggc3RhYmxlLCBtZXNvdHJvcGhpYyBzZWRpbWVudHMgd2l0aCBwaW9uZWVyIG9yIGVwaGVtZXJhbCB2ZWdldGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8NCiAgICAgICAgICAgICAgICAgICAgKSkNCiAgICAgICAgICkNCmBgYA0KDQpgYGB7cn0NCiMgQ29ycmVjdCBFVU5JU2IgbGV2ZWxzIDItNCBkZXNjcmlwdGlvbnMNCmRiX3Jlc3VydiA8LSBkYl9yZXN1cnYgJT4lDQogIG11dGF0ZShFVU5JU2JfMl9kZXNjciA9IA0KICAgICAgICAgICBpZmVsc2UoIWlzLm5hKEVVTklTYl8yX2Rlc2NyKSwgRVVOSVNiXzJfZGVzY3IsDQogICAgICAgICAgICAgICAgICBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgICAgIEVVTklTYl8yID09ICJQaiIgfiAiU3RvbmV3b3J0IHZlZ2V0YXRpb24iLA0KICAgICAgICAgICAgICAgICAgICBFVU5JU2JfMiA9PSAiUjQiIH4gIkFscGluZSBhbmQgc3ViYWxwaW5lIGdyYXNzbGFuZHMiLA0KICAgICAgICAgICAgICAgICAgICBFVU5JU2JfMiA9PSAiUGYiIH4gIkZyZXNoLXdhdGVyIHN1Ym1lcmdlZCB2ZWdldGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICApDQpgYGANCg0KRVVOSVNjIGFuZCBFVU5JU2QgbGV2ZWxzIDItNCBhcmUgT0suDQogDQojIE5vdGVzIEVVTklTIGNvZGVzIC0gdG8gY2hhbmdlPw0KDQpodHRwczovL3d3dy5zY2kubXVuaS5jei9ib3RhbnkvY2h5dHJ5L1NjaGFtaW5lZV9ldGFsMjAyMV9FRUEtUmVwb3J0LUFxdWF0aWMtV2V0bGFuZC1oYWJpdGF0cy5wZGYNCg0KRVVOSVNhXzIgPT0gIlE2IiA6ICJQZXJpb2RpY2FsbHkgZXhwb3NlZCBzaG9yZXMiDQpFVU5JU2FfMyA9ICJRNjEiIDogIlBlcmlvZGljYWxseSBleHBvc2VkIHNob3JlIHdpdGggc3RhYmxlLCBldXRyb3BoaWMgc2VkaW1lbnRzIHdpdGgNCnBpb25lZXIgb3IgZXBoZW1lcmFsIHZlZ2V0YXRpb24iDQpFVU5JU2FfMyA9PSAiUTYyIiA6ICJQZXJpb2RpY2FsbHkgZXhwb3NlZCBzaG9yZSB3aXRoIHN0YWJsZSwgbWVzb3Ryb3BoaWMgc2VkaW1lbnRzIHdpdGggcGlvbmVlciBvciBlcGhlbWVyYWwgdmVnZXRhdGlvbiINCg0KVGhpcyBjbGFzc2lmaWNhdGlvbiBvZiBRICsgbnVtYmVycyBpcyBub3cgY29leGlzdGluZyBpbiB0aGUgZGF0YWJhc2Ugd2l0aCBRYSAmIFFiIChtZXRhZGF0YSkuIEhvdyB0byBwcm9jZWVkPw0KDQpgYGB7cn0NCmRiX3Jlc3VydiAlPiUgZmlsdGVyKEVVTklTYV8xID09ICJRIikgJT4lIGRpc3RpbmN0KEVVTklTYV8yKQ0KYGBgDQoNCg0KIyBQbG90cyBvZiBsZXZlbC0yIGNhdGVnb3JpZXMgd2l0aGluIGVhY2ggbGV2ZWwgMSBjYXRlZ29yeQ0KDQpgYGB7cn0NCmdncGxvdChkYl9yZXN1cnYgJT4lIGZpbHRlcihFVU5JU2FfMSA9PSAiTUEiKSwgYWVzKEVVTklTYV8yX2Rlc2NyKSkgKw0KICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgKw0KICBsYWJzKHkgPSAiUGVyY2VudGFnZSBvZiBSZVN1cnZleSBvYnNlcnZhdGlvbnMiLA0KICAgICAgIHggPSAiRVVOSVMgbGV2ZWwgMiIpICsgY29vcmRfZmxpcCgpICsNCiAgZ2d0aXRsZShkYl9yZXN1cnYgJT4lIGZpbHRlcihFVU5JU2FfMSA9PSAiTUEiKSAlPiUgZGlzdGluY3QoRVVOSVNhXzFfZGVzY3IpKQ0KZ2dzYXZlKGZpbGVuYW1lPWhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwiTUFfbGV2ZWwyLnRpZmYiKSwNCiAgICAgICB3aWR0aD0xNCxoZWlnaHQ9OCx1bml0cz0iY20iLGRwaT0zMDApDQpnZ3Bsb3QoZGJfcmVzdXJ2ICU+JSBmaWx0ZXIoRVVOSVNhXzEgPT0gIk4iKSwgYWVzKEVVTklTYV8yX2Rlc2NyKSkgKw0KICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgKw0KICBsYWJzKHkgPSAiUGVyY2VudGFnZSBvZiBSZVN1cnZleSBvYnNlcnZhdGlvbnMiLA0KICAgICAgIHggPSAiRVVOSVMgbGV2ZWwgMiIpICsgY29vcmRfZmxpcCgpICsNCiAgZ2d0aXRsZShkYl9yZXN1cnYgJT4lIGZpbHRlcihFVU5JU2FfMSA9PSAiTiIpICU+JSBkaXN0aW5jdChFVU5JU2FfMV9kZXNjcikpDQpnZ3NhdmUoZmlsZW5hbWU9aGVyZSgib3V0cHV0IiwgImZpZ3VyZXMiLCJOX2xldmVsMi50aWZmIiksDQogICAgICAgd2lkdGg9MTQsaGVpZ2h0PTgsdW5pdHM9ImNtIixkcGk9MzAwKQ0KZ2dwbG90KGRiX3Jlc3VydiAlPiUgZmlsdGVyKEVVTklTYV8xID09ICJQIiksIGFlcyhFVU5JU2FfMl9kZXNjcikpICsNCiAgICAgICAgIGdlb21fYmFyKGFlcyh5ID0gKC4uY291bnQuLikgLyBzdW0oLi5jb3VudC4uKSAqIDEwMCkpICsNCiAgbGFicyh5ID0gIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIiwNCiAgICAgICB4ID0gIkVVTklTIGxldmVsIDIiKSArIGNvb3JkX2ZsaXAoKSArDQogIGdndGl0bGUoZGJfcmVzdXJ2ICU+JSBmaWx0ZXIoRVVOSVNhXzEgPT0gIlAiKSAlPiUgZGlzdGluY3QoRVVOSVNhXzFfZGVzY3IpKQ0KZ2dzYXZlKGZpbGVuYW1lPWhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwiUF9sZXZlbDIudGlmZiIpLA0KICAgICAgIHdpZHRoPTE0LGhlaWdodD04LHVuaXRzPSJjbSIsZHBpPTMwMCkNCmdncGxvdChkYl9yZXN1cnYgJT4lIGZpbHRlcihFVU5JU2FfMSA9PSAiUSIpLCBhZXMoRVVOSVNhXzJfZGVzY3IpKSArDQogICAgICAgICBnZW9tX2JhcihhZXMoeSA9ICguLmNvdW50Li4pIC8gc3VtKC4uY291bnQuLikgKiAxMDApKSArDQogIGxhYnMoeSA9ICJQZXJjZW50YWdlIG9mIFJlU3VydmV5IG9ic2VydmF0aW9ucyIsDQogICAgICAgeCA9ICJFVU5JUyBsZXZlbCAyIikgKyBjb29yZF9mbGlwKCkgKw0KICBnZ3RpdGxlKGRiX3Jlc3VydiAlPiUgZmlsdGVyKEVVTklTYV8xID09ICJRIikgJT4lIGRpc3RpbmN0KEVVTklTYV8xX2Rlc2NyKSkNCmdnc2F2ZShmaWxlbmFtZT1oZXJlKCJvdXRwdXQiLCAiZmlndXJlcyIsIlFfbGV2ZWwyLnRpZmYiKSwNCiAgICAgICB3aWR0aD0xNCxoZWlnaHQ9OCx1bml0cz0iY20iLGRwaT0zMDApDQpnZ3Bsb3QoZGJfcmVzdXJ2ICU+JSBmaWx0ZXIoRVVOSVNhXzEgPT0gIlIiKSwgYWVzKEVVTklTYV8yX2Rlc2NyKSkgKw0KICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgKw0KICBsYWJzKHkgPSAiUGVyY2VudGFnZSBvZiBSZVN1cnZleSBvYnNlcnZhdGlvbnMiLA0KICAgICAgIHggPSAiRVVOSVMgbGV2ZWwgMiIpICsgY29vcmRfZmxpcCgpICsNCiAgZ2d0aXRsZShkYl9yZXN1cnYgJT4lIGZpbHRlcihFVU5JU2FfMSA9PSAiUiIpICU+JSBkaXN0aW5jdChFVU5JU2FfMV9kZXNjcikpDQpnZ3NhdmUoZmlsZW5hbWU9aGVyZSgib3V0cHV0IiwgImZpZ3VyZXMiLCJSX2xldmVsMi50aWZmIiksDQogICAgICAgd2lkdGg9MTQsaGVpZ2h0PTgsdW5pdHM9ImNtIixkcGk9MzAwKQ0KZ2dwbG90KGRiX3Jlc3VydiAlPiUgZmlsdGVyKEVVTklTYV8xID09ICJTIiksIGFlcyhFVU5JU2FfMl9kZXNjcikpICsNCiAgICAgICAgIGdlb21fYmFyKGFlcyh5ID0gKC4uY291bnQuLikgLyBzdW0oLi5jb3VudC4uKSAqIDEwMCkpICsNCiAgbGFicyh5ID0gIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIiwNCiAgICAgICB4ID0gIkVVTklTIGxldmVsIDIiKSArIGNvb3JkX2ZsaXAoKSArDQogIGdndGl0bGUoZGJfcmVzdXJ2ICU+JSBmaWx0ZXIoRVVOSVNhXzEgPT0gIlMiKSAlPiUgZGlzdGluY3QoRVVOSVNhXzFfZGVzY3IpKQ0KZ2dzYXZlKGZpbGVuYW1lPWhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwiU19sZXZlbDIudGlmZiIpLA0KICAgICAgIHdpZHRoPTE2LGhlaWdodD04LHVuaXRzPSJjbSIsZHBpPTMwMCkNCmdncGxvdChkYl9yZXN1cnYgJT4lIGZpbHRlcihFVU5JU2FfMSA9PSAiVCIpLCBhZXMoRVVOSVNhXzJfZGVzY3IpKSArDQogICAgICAgICBnZW9tX2JhcihhZXMoeSA9ICguLmNvdW50Li4pIC8gc3VtKC4uY291bnQuLikgKiAxMDApKSArDQogIGxhYnMoeSA9ICJQZXJjZW50YWdlIG9mIFJlU3VydmV5IG9ic2VydmF0aW9ucyIsDQogICAgICAgeCA9ICJFVU5JUyBsZXZlbCAyIikgKyBjb29yZF9mbGlwKCkgKw0KICBnZ3RpdGxlKGRiX3Jlc3VydiAlPiUgZmlsdGVyKEVVTklTYV8xID09ICJUIikgJT4lIGRpc3RpbmN0KEVVTklTYV8xX2Rlc2NyKSkNCmdnc2F2ZShmaWxlbmFtZT1oZXJlKCJvdXRwdXQiLCAiZmlndXJlcyIsIlRfbGV2ZWwyLnRpZmYiKSwNCiAgICAgICB3aWR0aD0xNCxoZWlnaHQ9OCx1bml0cz0iY20iLGRwaT0zMDApDQpnZ3Bsb3QoZGJfcmVzdXJ2ICU+JSBmaWx0ZXIoRVVOSVNhXzEgPT0gIlUiKSwgYWVzKEVVTklTYV8yX2Rlc2NyKSkgKw0KICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgKw0KICBsYWJzKHkgPSAiUGVyY2VudGFnZSBvZiBSZVN1cnZleSBvYnNlcnZhdGlvbnMiLA0KICAgICAgIHggPSAiRVVOSVMgbGV2ZWwgMiIpICsgY29vcmRfZmxpcCgpICsNCiAgZ2d0aXRsZShkYl9yZXN1cnYgJT4lIGZpbHRlcihFVU5JU2FfMSA9PSAiVSIpICU+JSBkaXN0aW5jdChFVU5JU2FfMV9kZXNjcikpDQpnZ3NhdmUoZmlsZW5hbWU9aGVyZSgib3V0cHV0IiwgImZpZ3VyZXMiLCJVX2xldmVsMi50aWZmIiksDQogICAgICAgd2lkdGg9MTYsaGVpZ2h0PTgsdW5pdHM9ImNtIixkcGk9MzAwKQ0KZ2dwbG90KGRiX3Jlc3VydiAlPiUgZmlsdGVyKEVVTklTYV8xID09ICJWIiksIGFlcyhFVU5JU2FfMl9kZXNjcikpICsNCiAgICAgICAgIGdlb21fYmFyKGFlcyh5ID0gKC4uY291bnQuLikgLyBzdW0oLi5jb3VudC4uKSAqIDEwMCkpICsNCiAgbGFicyh5ID0gIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zIiwNCiAgICAgICB4ID0gIkVVTklTIGxldmVsIDIiKSArIGNvb3JkX2ZsaXAoKSArDQogIGdndGl0bGUoZGJfcmVzdXJ2ICU+JSBmaWx0ZXIoRVVOSVNhXzEgPT0gIlYiKSAlPiUgZGlzdGluY3QoRVVOSVNhXzFfZGVzY3IpKQ0KZ2dzYXZlKGZpbGVuYW1lPWhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwiVl9sZXZlbDIudGlmZiIpLA0KICAgICAgIHdpZHRoPTE0LGhlaWdodD04LHVuaXRzPSJjbSIsZHBpPTMwMCkNCmBgYA0KDQojIFNlc3Npb24gaW5mbw0KDQpgYGB7cn0NCnNlc3Npb25JbmZvKCkNCmBgYA0KDQoNCg0K